在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);
我试图搜索解决方案,阅读手册和文档,但我的所有尝试都失败了。 (黑色背景,质量差但仍然填充背景)
请帮助获得理想的结果。
感谢大家的帮助和建议。
答案 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]