Jump to content

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


Recommended Posts

Отличие, например,  в том, что файл, который выложил kislotnik, имеет нестандартное начало, а именно:

<?php

require_once('Newcms.php');

class Image extends Newcms
{

И у kislotnik-а это работает. Видимо, у него система несколько переделана по сравнению со стандартной. А он этого не замечает и выкладывает файл, который  для стандартной Simpla работать с гарантией не будет...

Link to post
Share on other sites
  • 1 month later...
  • Replies 64
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

  • 1 month later...
  • 4 weeks later...

Отлично!!! работает спасибо!!!

Только столкнулся с проблемой, иногда не показывает картинку, пишет: The requested content cannot be loaded. Please try again later.

Link to post
Share on other sites
  • 3 weeks later...
  • 3 weeks later...

Читайте в шапке темы.

 

Если имеете в виду начальный пост темы, то Ваш совет не подойдет.

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

А обсуждаемый вопрос совсем о другом - о том, что некоторые  картинки после импорта не показываются при первой загрузке страницы.

Некоторые подробности можно увидеть тут:

http://simpla-tuning.com/tonkaya-oshibka-v-rabote-s-izobrazheniyami-tovarov

 

Спасибо, само решение оказалось простым и заняло минуту и не нужно платить 50$

 

Судя по тому, что n1c не желает выложить решение, которое "заняло минуту", очень сомнительно, что оно у него вообще есть. Скорее всего, создан какой-нибудь костыль, который дает другие недостатки...

Link to post
Share on other sites

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

Link to post
Share on other sites

Мое решение тоже заняло минуту и работает )

Прям пришло в голову и исправлюсь за минуту? Это звучит крайне маловероятно.

Если это так то расскажите нам как Вы это сделали за минуту или о Вас точно так же подумают как и про предыдущего скорострела по решению задачек за минуту.

Link to post
Share on other sites

Решение примитивное, но работает, я заметил, что ошибка появляется когда загружаю картинки с разрешением 600 или 800 с любой из сторон, в product.tpl заменил ресайз 800:600 на 801:601, примитивно, но работает и бесплатно ))) 

Edited by Gandalf
Link to post
Share on other sites

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

 

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

 

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

Link to post
Share on other sites

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

Edited by n1c
Link to post
Share on other sites

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

 

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

 

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

Link to post
Share on other sites

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

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

Edited by Gandalf
Link to post
Share on other sites
  • 3 weeks later...

Писал под 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 заменить соответствующий кусок кода.

Edited by Мизантроп
Link to post
Share on other sites
  • 8 months later...

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

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

 

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

Link to post
Share on other sites
  • 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;
	}

 

Не подскажите, пожалуйста, как сюда добавить дополнительное условие:

Если исходная загружаемая картинка размером меньше 800 х 600, то самое большое изображение для нее не дорисовывается белыми пикселями.

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

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

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

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

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

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

Edited by Julius123
Link to post
Share on other sites

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...