如何在不填充背景颜色的情况下调整图像大小

时间:2015-04-27 12:27:51

标签: php image image-processing jpeg opencart

在PHP中转换JPEG图像时遇到一个问题。

我正在做什么

我有不同的图像格式,我需要根据它将使用的容器(例如幻灯片放映)调整它们的大小。

老实说,这是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);

我试图搜索解决方案,阅读手册和文档,但我的所有尝试都失败了。 (黑色背景,质量差但仍然填充背景)

请帮助获得理​​想的结果。
感谢大家的帮助和建议。

2 个答案:

答案 0 :(得分:3)

    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);
    }

试试这个

答案 1 :(得分:0)

您可以使用imagemagick来获取它。

调整图像大小(不带黑色边框),您可以这样做:

[weak self]