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



我在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);

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

请帮助获得所需的结果
感谢大家的帮助和建议。

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

试试这个

您可以使用imagemagik来获取它。

调整没有黑色边框的图像大小,你可以这样做:

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

相关内容

最新更新