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


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

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

resize gd

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

#41 Kors

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

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

А сделать картинку шириной 800 у Вас, значит, нельзя? И это Вы называете решением?

 

Это совсем не решение, это костыль, который почему-то срабатывает именно у Вас из-за особенностей Вашего сайта или хостинга...

 

Подождем отзывов, что скажут другие, поможет ли им такой способ...



#42 n1c

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

Опубликовано 10.10.2015 - 17:12

Если не вмешиваться в сам код image.php, то да, надо уменьшать размер фото, либо загружать большие, либо убрать вод.знак в product.tpl находим resize:800:600:w и убираем :w


Изменено: n1c, 10.10.2015 - 17:14


#43 Kors

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

Опубликовано 10.10.2015 - 17:25

Если не вмешиваться в сам код image.php, то да, надо уменьшать размер фото, либо загружать большие, либо убрать вод.знак в product.tpl находим resize:800:600:w и убираем :w

 

"надо уменьшать (НЕИЗВЕСТНО ДО КАКИХ ПРЕДЕЛОВ), либо загружать большие (ТОЖЕ НЕИЗВЕСТНО НАСКОЛЬКО БОЛЬШИЕ), либо убрать вод.знак в product.tpl" -  это пережевывание соплей Вы называете решением?

 

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



#44 Gandalf

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

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

Пофиг, работает и бесплатно )))   скоро на другую CMS перенесу,

Simpla уже не актуальна с таким функционалом, у меня остался последний сайт на Simpla.


Изменено: Gandalf, 11.10.2015 - 18:45


#45 Мизантроп

Мизантроп
  • Пользователь
  • 30 сообщений
  • Программирование
  • Версия CMS:2.x

Опубликовано 28.10.2015 - 14:38

Писал под 2.3.х

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($dst_w, $dst_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(), 0,  0);                
        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;
}

Imagick без белых полос. В api/Image.php заменить соответствующий кусок кода.


Изменено: Мизантроп, 28.10.2015 - 14:49


#46 xikarx

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

Опубликовано 05.07.2016 - 10:57

Появился вопрос - каким образом определяется размер (в смысле "вес") картинок, создаваемых ресайзом?

Заморочился вот недавно оптимизацией изображений, чисто вручную фотошопом поменял оптимизировал некоторые картинки - добился чтоб оригинальные картинки весили не больше 100КБ. Думал вес оригинала повлияет на размер ресайзов. Нифига. Ресайз основных картинок как весил 212КБ, так и весит (это при том, что оригинальная картинка меньше 100КБ). Почему так? Как заставить модуль ресайза делать картинки весом поменьше?

 

З.Ы. Папку products чистил.



#47 Proxy

Proxy
  • Пользователь
  • 14 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Россия, Саратов

Опубликовано 07.10.2016 - 10: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;
	}


Не подскажите, пожалуйста, как сюда добавить дополнительное условие:
Если исходная загружаемая картинка размером меньше 800 х 600, то самое большое изображение для нее не дорисовывается белыми пикселями.
Часто бывает что в наличии есть только картинка например 400 х 500. Тогда получается что маленькие превьюшки получаются красиво, а большая картинка 800:600w дорисовывает широкие белые поля и с телефона картинку нормально не рассмотришь, так как фансибокс уменьшает пропорционально экрану.



#48 Julius123

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

Опубликовано 09.10.2016 - 11:47

Задам вопрос немного не по этой теме но близко к этому. Когда создаю новый товар картинки там где они нарезаются появляются не сразу, то есть мне нужно зайти на страницу товара, на страницу категории, с телефона и планшета (т.к везде разные размеры нарезаются) и обновить страницу пару раз чтобы картинки нарезались и появились, это баг симплы такой что картинки нарезаются только при обращении к странице в первый раз?



#49 Kosjak76

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

Опубликовано 09.10.2016 - 12:43

Это не баг, это фича))

А то, что несколько раз нужно обновить - это баг хостинга.

Попробуйте отключить imagick в конфиге, на некоторых хостингах это помогает.



#50 Julius123

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

Опубликовано 05.12.2016 - 22:45

Подскажите в чем проблема, если в конфиге включен imagick то ничего не работает, нарезаются как и раньше неправильно, а если выключить imagick, то есть через gd то работает правильно но для новых товаров картинки вообще не нарезает.

пробовал два предложенных варианта для imagick и ничего не меняется

папку products конечно же очищал


Изменено: Julius123, 05.12.2016 - 22:53


#51 n1c

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

Опубликовано 23.02.2017 - 14:01

А как убрать "умный ресайз" из блога?



#52 Julius123

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

Опубликовано 11.11.2017 - 21:49

Подскажите что именно менялось? т.к делал правки в этом файле и не могу заменить целиком



#53 Noxter

Noxter

    Simpla Developer

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

Опубликовано 12.11.2017 - 02:11


Подскажите что именно менялось? т.к делал правки в этом файле и не могу заменить целиком


Ищите комментарии по слову edit

#54 voron

voron
  • Пользователь
  • 2 сообщений
  • Пользователь
  • Откуда:Москва

Опубликовано 18.01.2018 - 11:37

Привет, а вопросом сжатия изображений никто не задавался? На хостинге много лишнего пространства занято, да и Google PageSpeed ругается, говорит до 82% размера можно сжать. Я в Image.php покопался - для GD это $quality, при отключении Imagemagick все сжимается отлично. Но что добавить в обработку Imagemagick, которая идет ниже, чтобы управлять сжатием? Ведь Imagemagick считается побыстрее...



#55 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 18.01.2018 - 17:41

В файлике api/Image.php в методе image_constrain_gd поставьте не 100, а например 60.

 

$quality = 100; 


#56 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 23.01.2018 - 10:37

Подскажите, есть ли у кого модернизированный модуль, чтобы делал нужный формат кропая изображение? Например есть фотка 500 на 350, надо получить 350 на 350, скрипт должен кропнуть фотку сверху и снизу. чтобы из одного формата получился другой, без добавления белых полосок



#57 yr4ik

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

Опубликовано 24.01.2018 - 20:32

Подскажите, есть ли у кого модернизированный модуль, чтобы делал нужный формат кропая изображение? Например есть фотка 500 на 350, надо получить 350 на 350, скрипт должен кропнуть фотку сверху и снизу. чтобы из одного формата получился другой, без добавления белых полосок

 

Я когда то давно делал на одном сайте. Но нужно искать..

Помню только что дорабатывал через imagick и cropThumbnailImage http://php.net/manua...mbnailimage.php



#58 a13x

a13x
  • Забаненый
  • 213 сообщений
  • Дизайн, Программирование, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 25.01.2018 - 00:00

Понял, придётся готовый класс подключать который всё это умеет.



#59 question

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

Опубликовано 16.06.2018 - 13:53

Есть ли модуль, сочетающий в себе ресайз и кроп?

Для одних товаров нужно делать обычный ресайз, для других - ресайз + кропом. Например,

1. было 800х600, стало 600х600 с обрезкой справа и слева по 100 пикселей

2. Было 1200х1200, стало 600х600 без обрезки

3. Было 1400х1200, стало 600х600 сначала путём ресайза к 700х600, а заием обрезкой по 50 пикс. сверху и снизу.



#60 phukortsin

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

Опубликовано 16.06.2018 - 14:57

Полностью готовый под Simpla вряд ли есть. А  написать свой, конечно, можно.

 

3. И если провести указанные действия, получится не то, что написано, а 700х500...







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

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

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