Jump to content

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


Recommended Posts

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

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

post-1348-0-76640600-1377616753_thumb.jpg

post-1348-0-71015100-1377616935_thumb.jpg

Image.php

Image.php

Edited by partizzzzzan
Link to post
Share on other sites
  • Replies 64
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

 

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

согласен, всегда пользуюсь этим методом
Link to post
Share on other sites
  • 4 months later...
  • 2 months later...

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

 

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

Link to post
Share on other sites
  • 5 months later...
  • 3 months later...

Вот вроде накидал для 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;
	}
Link to post
Share on other sites
  • 3 weeks later...

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

 

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

А еще может быть, что родитель у элемента содержит еще какие-то элементы, тогда что-то в верстке менять надо.

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

 

А если сайтов несколько и шаблонов несколько?

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

Link to post
Share on other sites
  • 4 months later...

В том смысле, что если в папке файлс/продуктс уже есть готовые старые файлы ресайза, то при замене функции ничего не поменяется, а разница будет заметна только на новых картинках и новых товарах

Link to post
Share on other sites
  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...