Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

На форуме поднимали вопрос на счет ресайза изображений Я изменил функцию ресайза изображений для библиотеки 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

Изменено пользователем partizzzzzan
Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 64
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Изображения в теме

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

Ссылка на сообщение
Поделиться на другие сайты

partizzzzzan

 

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

 

http://simplacms.16mb.com/products/fotoapparat_canon_powershot_a3200_is

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

согласен, всегда пользуюсь этим методом
Ссылка на сообщение
Поделиться на другие сайты
  • 4 месяца спустя...
  • 2 месяца спустя...

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 5 месяцев спустя...
  • 3 месяца спустя...

Вот вроде накидал для 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;
	}
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 4 месяца спустя...

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...