Перейти к содержимому


Фото
* * * * - 5 голосов

Умный ресайз изображений

resize gd

  • Чтобы отвечать, сперва войдите на форум
52 ответов в теме

#1 partizzzzzan

partizzzzzan
  • Пользователь
  • 49 сообщений

Опубликовано 27.08.2013 - 18:25

На форуме поднимали вопрос на счет ресайза изображений Я изменил функцию ресайза изображений для библиотеки gd ресайз делается точно соответсвуя размерам, например, если указано resize:200:200 превью получиться 200 на 200, даже если исходник не пропорционален этим размерам. Превью создается по большей из сторон,пустоты заливаются либо прозрачным цветом, либо белым. в прикрепленных файлах исходное изображение и после ресайза. заполняемыйцвет специально изменен с белого, чтобы показатькак работает функция. Функция сделана пока что только для gd библиотеки, для imagick сделаю позже. в файле изменения помечены //edit1, //edit2 и т.д. Для того чтобы функция работала заменить файл api/image.php

P.S. ВНИМАНИЕ!!! Второй файл Image.php для версии 2.3.x т.к. обнаружил небольшие изменения в данном файле в версии 2.3.x

Прикрепленные файлы:


Изменено: partizzzzzan, 16.08.2014 - 20:16


#2 AnyKey

AnyKey
  • Пользователь
  • 49 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:1.x, 2.x

Опубликовано 27.08.2013 - 20:23

Ай молодец!



#3 partizzzzzan

partizzzzzan
  • Пользователь
  • 49 сообщений

Опубликовано 27.08.2013 - 21:09

Сам не нарадуюсь)))) В php особо не силен, взял за основу подобную функцию в opencart, почитал документацию по gd и вот получилось!!!!!



#4 Danya

Danya
  • Фрилансер
  • 908 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x

Опубликовано 28.08.2013 - 16:50

partizzzzzan

 

На странице товара получается сильно большой отступ:

 

http://simplacms.16m...ershot_a3200_is



#5 Kpoxa

Kpoxa
  • Пользователь
  • 639 сообщений
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 28.08.2013 - 17:05

partizzzzzan

 

На странице товара получается сильно большой отступ:

 

http://simplacms.16m...ershot_a3200_is

У Вас размеры картинки 200х300 почему-то



#6 Danya

Danya
  • Фрилансер
  • 908 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x

Опубликовано 28.08.2013 - 17:09

исправил, спасибо!



#7 Kpoxa

Kpoxa
  • Пользователь
  • 639 сообщений
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 28.08.2013 - 17:13

Да не за что, и верните изменения в css, .product .image{ width:200px; .... } будет по красивее.



#8 ps-simpla

ps-simpla

    Модератор в запасе :)

  • Фрилансер
  • 972 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Пермский край

Опубликовано 29.08.2013 - 19:53


Да не за что, и верните изменения в css, .product .image{ width:200px; .... } будет по красивее.

согласен, всегда пользуюсь этим методом

#9 luxury

luxury
  • Пользователь
  • 101 сообщений
  • Заказчик

Опубликовано 13.01.2014 - 12:24

Для  imagick не делали ещё?



#10 chubr

chubr
  • Пользователь
  • 73 сообщений
  • Заказчик
  • Версия CMS:2.x
  • Откуда:Псков

Опубликовано 13.03.2014 - 23:01

подскажите, как можно добиться увеличение изображения?

 

и хочется чтобы gif анимация сохранялась не только на большом изображении, но и на уменьшиных, это возможно?



#11 partizzzzzan

partizzzzzan
  • Пользователь
  • 49 сообщений

Опубликовано 16.08.2014 - 19:18

Для  imagick не делали ещё?

 

Да как-то руки не дошли, но думаю займусь этим в ближайшее время



#12 Kosjak76

Kosjak76
  • Модератор
  • 3 587 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 30.11.2014 - 17:33

Вот вроде накидал для imagick, пробуйте

	private function image_constrain_imagick($src_file, $dst_file, $max_w, $max_h, $watermark=null, $watermark_offet_x=0, $watermark_offet_y=0, $watermark_opacity=1, $sharpen=0.2)
	{
		$thumb = new Imagick();
		
		// Читаем изображение
		if(!$thumb->readImage($src_file))
			return false;
		
		// Размеры исходного изображения
		$src_w = $thumb->getImageWidth();
		$src_h = $thumb->getImageHeight();
		
		// Нужно ли обрезать?
		if (!$watermark && ($src_w <= $max_w) && ($src_h <= $max_h))
	    { 
			// Нет - просто скопируем файл
			if (!copy($src_file, $dst_file))
				return false;
			return true;
	    }	
			
		// Размеры превью при пропорциональном уменьшении
		list($dst_w, $dst_h) = $this->calc_contrain_size($src_w, $src_h, $max_w, $max_h);
	
		// Уменьшаем
		$thumb->thumbnailImage($dst_w, $dst_h);
	   $canvas = new Imagick();
      $canvas->newImage($max_w, $max_h, new ImagickPixel("white"));
		
		// Устанавливаем водяной знак
		if($watermark && is_readable($watermark))
		{
			$overlay = new Imagick($watermark);
			//$overlay->setImageOpacity($watermark_opacity);
			//$overlay_compose = $overlay->getImageCompose();
			$overlay->evaluateImage(Imagick::EVALUATE_MULTIPLY, $watermark_opacity, Imagick::CHANNEL_ALPHA);
			
			// Get the size of overlay 
			$owidth = $overlay->getImageWidth(); 
			$oheight = $overlay->getImageHeight();
			
			$watermark_x = min(($max_w-$owidth)*$watermark_offet_x/100, $max_w); 
			$watermark_y = min(($max_h-$oheight)*$watermark_offet_y/100, $max_h); 
			
		}
		
		
		// Анимированные gif требуют прохода по фреймам
		foreach($thumb as $frame)
		{
			// Уменьшаем
			$frame->thumbnailImage($dst_w, $dst_h);
			
	    	/* Set the virtual canvas to correct size */
	    	$frame->setImagePage($dst_w, $dst_h, 0, 0);
	    	
			// Наводим резкость
			if($sharpen > 0)		
				$thumb->adaptiveSharpenImage($sharpen, $sharpen);
			$canvas->compositeImage($frame, $frame->getImageCompose(), ($max_w-$dst_w)/2,  ($max_h-$dst_h)/2);				
			if(isset($overlay) && is_object($overlay))
			{
				// $frame->compositeImage($overlay, $overlay_compose, $watermark_x, $watermark_y, imagick::COLOR_ALPHA);
				$canvas->compositeImage($overlay, imagick::COMPOSITE_OVER, $watermark_x, $watermark_y, imagick::COLOR_ALPHA);
			}
		
		}	
		
		// Убираем комменты и т.п. из картинки
		$canvas->stripImage();
		
		//		$thumb->setImageCompressionQuality(100);

		// Записываем картинку
		if(!$canvas->writeImages($dst_file, true))
			return false;
		
		// Уборка
		$thumb->destroy();
		if(isset($overlay) && is_object($overlay))
			$overlay->destroy();
		$canvas->destroy();		
		return true;
	}


#13 partizzzzzan

partizzzzzan
  • Пользователь
  • 49 сообщений

Опубликовано 30.11.2014 - 18:38

Красавчик, молодец!



#14 Kosjak76

Kosjak76
  • Модератор
  • 3 587 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 30.11.2014 - 18:42

Думаю, стоит еще убрать проверку на обрезание, это очень хорошо будет для адаптивных шаблонов.



#15 Kosjak76

Kosjak76
  • Модератор
  • 3 587 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 30.11.2014 - 18:45

Точнее, не убрать, а накладывать на подложку исходное изображение.



#16 SmartyDev

SmartyDev
  • Сомнительные
  • 94 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x

Опубликовано 17.12.2014 - 09:08

А смысл от этой доработки, зачем так заморачиваться когда в CSS можно всё сделать, прописав родителю "display: table-cell, vertical-align: middle и т.д."



#17 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 17.12.2014 - 10:44

А в чем тут трудности - пару файлов скопировать?

Прописывать родителю "display: table-cell, vertical-align: middle и т.д." придется в шаблоне в НЕСКОЛЬКИХ местах, и не под копирку, а в каждом индивидуально в стилях размеры устанавливать.
А еще может быть, что родитель у элемента содержит еще какие-то элементы, тогда что-то в верстке менять надо.
А уж если шаблон меняется хотя бы время от времени, то по Вашему предложению хлопот точно будет больше...

А если сайтов несколько и шаблонов несколько?
Предлагаемый метод работает сразу ВО ВСЕХ ШАБЛОНАХ, в Вы зовете с каждым шаблоном возиться отдельно...

#18 kislotnik

kislotnik
  • Пользователь
  • 279 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 28.04.2015 - 16:52

на 2.3.6 раюотает?



#19 Noxter

Noxter
  • Фрилансер
  • 5 764 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 28.04.2015 - 17:13


на 2.3.6 раюотает?


Вам ничего не мешает проверить это самостоятельно, это будет быстрее чем тупо ждать ответа.

#20 kislotnik

kislotnik
  • Пользователь
  • 279 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 28.04.2015 - 18:05

Уже проверил.не работает.





Также с меткой «resize, gd»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых