1. Уважаемые пользователи, прежде чем ответить в теме или создать новую,
    внимательно ознакомьтесь с правилами раздела

    Кому лень работать или руки не оттуда - пользуйтесь услугами специалистов
  2. Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.."

    Есть JED!!! Ищите там!!!

VM 2.x Модификации для создания квадратной миниатюры с обрезанием по центру

Тема в разделе "Virtuemart", создана пользователем red_heads, 12 авг 2014.

Информация :
  • Уважаемые пользователи, прежде чем ответить в теме или создать новую, внимательно ознакомьтесь с правилами раздела
  • Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.." Есть JED!!! Ищите там!!!
  • Аналоги ищите там же - на JED!!!
  • Новая версия? - У кого будет - тот выложит!
  1. red_heads

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    157
    Симпатии:
    26
    Есть ли готовый код , плагин? Чтоб при создании миниатюры изображение обрезалось , получалось квадратное превью. Прошу поделится.
     
  2. red_heads

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    157
    Симпатии:
    26
    Два решения

    1. нашла данную функцию в модуле News Show Pro GK5, теперь можно вывести красиво товары

    2. Нашла решение, у меня работает,
    файл virtuemart img2thumb.php,

    Код:
    private function NewImgResize($orig_img,$newxsize,$newysize,$filename)
        {
            //getimagesize returns array
            // [0] = width in pixels
            // [1] = height in pixels
            // [2] = type
            // [3] = img tag "width=xx height=xx" values
    
    
            $orig_size = getimagesize($filename);
    
            $newxsize = (int)$newxsize;
            $newysize = (int)$newysize;
            if(empty($newxsize) and empty($newysize)){
                vmWarn('NewImgResize failed x,y = 0','NewImgResize failed x,y = 0');
                return false;
            }
            $maxX = $newxsize;
            $maxY = $newysize;
    
            if ($orig_size[0]<$orig_size[1])
            {
                $newxsize = (int)$newysize * ($orig_size[0]/$orig_size[1]);
                $adjustX = (int)($maxX - $newxsize)/2;
                $adjustY = 0;
            }
            else
            {
                $newysize = (int) $newxsize / ($orig_size[0]/$orig_size[1]);
                $adjustX = 0;
                $adjustY = (int)($maxY - $newysize)/2;
            }
    
            /* Original code removed to allow for maxSize thumbnails
            $im_out = ImageCreateTrueColor($newxsize,$newysize);
            ImageCopyResampled($im_out, $orig_img, 0, 0, 0, 0,
                $newxsize, $newysize,$orig_size[0], $orig_size[1]);
            */
    
            //    New modification - creates new image at maxSize
            if( $this->maxSize )
            {
                if( function_exists("imagecreatetruecolor") )
                  $im_out = imagecreatetruecolor($maxX,$maxY);
                else
                  $im_out = imagecreate($maxX,$maxY);
    
                // Need to image fill just in case image is transparent, don't always want black background
                $bgfill = imagecolorallocate( $im_out, $this->bg_red, $this->bg_green, $this->bg_blue );
    
                if( function_exists( "imageAntiAlias" )) {
                    imageAntiAlias($im_out,true);
                }
                 imagealphablending($im_out, false);
                if( function_exists( "imagesavealpha")) {
                    imagesavealpha($im_out,true);
                }
                if( function_exists( "imagecolorallocatealpha")) {
                    $transparent = imagecolorallocatealpha($im_out, 255, 255, 255, 127);
                }
    
                //imagefill( $im_out, 0,0, $bgfill );
                if( function_exists("imagecopyresampled") ){
                    ImageCopyResampled($im_out, $orig_img, $adjustX, $adjustY, 0, 0, $newxsize, $newysize,$orig_size[0], $orig_size[1]);
                }
                else {
                    ImageCopyResized($im_out, $orig_img, $adjustX, $adjustY, 0, 0, $newxsize, $newysize,$orig_size[0], $orig_size[1]);
                }
    
            }
            else
            {
    
                if( function_exists("imagecreatetruecolor") )
                  $im_out = ImageCreateTrueColor($newxsize,$newysize);
                else
                  $im_out = imagecreate($newxsize,$newysize);
    
                if( function_exists( "imageAntiAlias" ))
                  imageAntiAlias($im_out,true);
                 imagealphablending($im_out, false);
                if( function_exists( "imagesavealpha"))
                  imagesavealpha($im_out,true);
                if( function_exists( "imagecolorallocatealpha"))
                  $transparent = imagecolorallocatealpha($im_out, 255, 255, 255, 127);
    
                if( function_exists("imagecopyresampled") )
                  ImageCopyResampled($im_out, $orig_img, 0, 0, 0, 0, $newxsize, $newysize,$orig_size[0], $orig_size[1]);
                else
                  ImageCopyResized($im_out, $orig_img, 0, 0, 0, 0, $newxsize, $newysize,$orig_size[0], $orig_size[1]);
            }
    
    
            return $im_out;
        }


    заменить на

    Код:
    function NewImgResize($orig_img,$newxsize,$newysize,$filename)
        {
        //$newxsize; //new width
        //$newysize; //new height
        $orig_size = getimagesize($filename);
        $heightRatio = $orig_size[1]/$newysize;
        $widthRatio = $orig_size[0]/$newxsize;
        if($heightRatio < $widthRatio){
            $optimalRatio = $heightRatio;
        } else {
            $optimalRatio = $widthRatio;
        }
        $optimalHeight = $orig_size[1]/$optimalRatio;
        $optimalWidth = $orig_size[0]/$optimalRatio;
        $imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
        $bgfill = imagecolorallocate( $imageResized, $this->bg_red, $this->bg_green, $this->bg_blue );
        imagealphablending($imageResized, false);
        imagesavealpha($imageResized,true);
        $transparent = imagecolorallocatealpha($imageResized, 255, 255, 255, 127);
        imagecopyresampled($imageResized, $orig_img, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $orig_size[0], $orig_size[1]);
        $cropStartX = ( $optimalWidth / 2) - ( $newxsize /2 );
        $cropStartY = ( $optimalHeight/ 2) - ( $newysize/2 );
        $crop = $imageResized;
        $imageResized = imagecreatetruecolor($newxsize , $newysize);
        $bgfill = imagecolorallocate( $imageResized, $this->bg_red, $this->bg_green, $this->bg_blue );
        imagealphablending($imageResized, false);
        imagesavealpha($imageResized,true);
        $transparent = imagecolorallocatealpha($imageResized, 255, 255, 255, 127);
        imagecopyresampled($imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newxsize, $newysize , $newxsize, $newysize);
        return $imageResized;
        }
     
    Последнее редактирование: 14 авг 2014
  3. basurmanka

    basurmanka Писатель

    Регистр.:
    14 май 2012
    Сообщения:
    8
    Симпатии:
    0
    Спасибо! Работает и на Vm3.
    Правда есть ньюанс - после ресайза добавляет границу черного цвета сверху\справа и т.д.
    [​IMG]
    В цветах стоит $transparent = imagecolorallocatealpha($imageResized, 255, 255, 255, 127);.
    Может кто-то поборол такую проблему?)
     
  4. Professor

    Professor Создатель

    Регистр.:
    27 май 2014
    Сообщения:
    30
    Симпатии:
    1
    а в настройках вирта не то? Там же есть параметры "размер превью" и как делать превью... обрезать или ресайзить
     
  5. Smart.Support

    Smart.Support Постоялец

    Регистр.:
    22 авг 2012
    Сообщения:
    98
    Симпатии:
    8
    Так может ты нам всем подскажешь (с скриншотом) где изменять эту опцию? %) Спасибо!