Как изменить размер изображения без заливки фона цветом

Как изменить размер изображения без заливки фона цветом

27.04.2015 03:27:50 Просмотров 32 Источник

У меня есть одна проблема при конвертации изображений JPEG в PHP.

Что я делаю?

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

Честно говоря, это стандартная реализация движка OpenCart. Что в этом плохого?

Когда я изменяю размер PNG, все работает идеально, и я получаю прозрачный фон.

Но когда я конвертирую изображения JPEG, я получаю фон, по умолчанию прямоугольник заполнен белым цветом. Я понимаю, что невозможно иметь JPEG с прозрачностью.

Результат, которого я хочу

Я хочу изменить размер изображений JPEG и скомпоновать их на прозрачный фон. Например, преобразовать и изменить размер JPEG, нарисовать прозрачный прямоугольник, поместить JPEG на этот прямоугольник и сохранить его в PNG или другой формат, который позволяет прозрачность.

Вот код::

$image_old = $this->image;
$this->image = imagecreatetruecolor($width, $height);

if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') {     
    imagealphablending($this->image, false);
    imagesavealpha($this->image, true);
    $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
    imagecolortransparent($this->image, $background);
} else {
    $background = imagecolorallocate($this->image, 255, 255, 255);
}

imagefilledrectangle($this->image, 0, 0, $width, $height, $background);

imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, 
    $new_width, $new_height, $this->info['width'], $this->info['height']);
imagedestroy($image_old);

Я пытался искать решения, читать руководства и документацию, но все мои попытки не увенчались успехом. (черный фон, плохое качество, но все еще заполненный фон)

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/29895773/how-to-resize-image-without-filling-background-with-color#comment47914713_29895773
Вы можете просто изменить размер изображения с помощью css, не так ли?
https://stackoverflow.com/questions/29895773/how-to-resize-image-without-filling-background-with-color#comment47914796_29895773
Проблема в том, что JPEG никогда не был прозрачным, поэтому его никогда нельзя будет получить с прозрачным фоном. Возможно, вы могли бы попытаться выяснить цвет фона и попытаться заменить этот цвет каким-то неясным цветом и сделать его прозрачным ... однако это будет выглядеть довольно плохо, так как края не будут сглажены или смешаны должным образом.
https://stackoverflow.com/questions/29895773/how-to-resize-image-without-filling-background-with-color#comment47917808_29895773
Нет способа просто объединить JPEG (не прозрачный) с прозрачным PNG и получить прозрачный PNG или GIF ?
https://stackoverflow.com/questions/29895773/how-to-resize-image-without-filling-background-with-color#comment97434469_29895773
Вы можете использовать CSS, чтобы сделать белые пиксели прозрачными: смотрите этот ответ: stackoverflow.com/a/34297963/273403

Ответы - Как изменить размер изображения без заливки фона цветом / How to resize image without filling background with color

Tanmoy

28.04.2015 12:22:46

    if(isset($_GET["path"]) && $_GET["path"] != "" && file_exists($_GET["path"])){

        $path = $_GET["path"];
        //getting extension type (jpg, png, etc)
        $type = explode(".", $path);
        $ext = strtolower($type[sizeof($type)-1]);
        $ext = (!in_array($ext, array("jpeg","png","gif"))) ? "jpeg" : $ext;

        //get image size
        $size = getimagesize($path);
        $width = $size[0];
        $height = $size[1];

        //get source image
        $func = "imagecreatefrom".$ext;
        $source = $func($path);

        //setting default values

        $new_width = $width;
        $new_height = $height;
        $k_w = 1;
        $k_h = 1;
        $dst_x =0;
        $dst_y =0;
        $src_x =0;
        $src_y =0;

        //selecting width and height
        if(!isset ($_GET["width"]) && !isset ($_GET["height"]))
        {
            $new_height = $height;
            $new_width = $width;
        }
        else if(!isset ($_GET["width"]))
        {
            $new_height = $_GET["height"];
            $new_width = ($width*$_GET["height"])/$height;
        }
        else if(!isset ($_GET["height"]))
        {
            $new_height = ($height*$_GET["width"])/$width;
            $new_width = $_GET["width"];
        }
        else
        {
            $new_width = $_GET["width"];
            $new_height = $_GET["height"];
        }

        //secelcting_offsets

        if($new_width>$width )//by width
        {
            $dst_x = ($new_width-$width)/2;
        }
        if($new_height>$height)//by height
        {
            $dst_y = ($new_height-$height)/2;
        }
        if( $new_width<$width || $new_height<$height )
        {
            $k_w = $new_width/$width;
            $k_h = $new_height/$height;

            if($new_height>$height)
            {
                $src_x  = ($width-$new_width)/2;
            }
            else if ($new_width>$width)
            {
                    $src_y  = ($height-$new_height)/2;
            }
            else
            {
                if($k_h>$k_w)
                {
                    $src_x = round(($width-($new_width/$k_h))/2);
                }
                else
                {
                    $src_y = round(($height-($new_height/$k_w))/2);
                }
            }
        }
        $output = imagecreatetruecolor( $new_width, $new_height);

        //to preserve PNG transparency
        if($ext == "png")
        {
            //saving all full alpha channel information
            imagesavealpha($output, true);
            //setting completely transparent color
            $transparent = imagecolorallocatealpha($output, 0, 0, 0, 127);
            //filling created image with transparent color
            imagefill($output, 0, 0, $transparent);
        }

        imagecopyresampled( $output, $source,  $dst_x, $dst_y, $src_x, $src_y, 
                        $new_width-2*$dst_x, $new_height-2*$dst_y, 
                        $width-2*$src_x, $height-2*$src_y);
        //free resources
        ImageDestroy($source);

        //output image
        header('Content-Type: image/'.$ext);
        $func = "image".$ext;
        $func($output); 

        //free resources
        ImageDestroy($output);
    }

Попробуй вот это

Kris Roofe

26.03.2019 03:39:23

Вы можете использовать imagemagick, чтобы получить его.

Изменить размер изображения без черной границы, вы можете сделать это так:

convert in.jpg -resize 800x572 -background white -alpha remove -bordercolor black out.jpg

Закрыть X