【发布时间】:2015-07-05 21:47:30
【问题描述】:
我在 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);
我曾尝试寻找解决方案、阅读手册和文档,但我所有的尝试都失败了。 (黑色背景,质量差,但背景仍然是填充的)
请帮助获得所需的结果。
感谢大家的帮助和建议。
【问题讨论】:
-
你可以用 css 调整图像的大小,不是吗?
-
问题是JPEG从一开始就不是透明的,所以永远不可能得到透明背景。您也许可以尝试找出背景颜色并尝试用一些模糊的颜色替换该颜色并使其透明......但是它看起来很糟糕,因为边缘不会被正确地消除锯齿或混合。
-
没有办法只是将 JPEG(不透明)与透明 PNG 合并并获得透明的 PNG 或 GIF 吗?
-
@user4836275。你的说法不正确。您可以在 JPG 中添加透明边框并在 ImageMagick 中另存为 PNG。convert image.jpg -bordercolor none -border 20 image.png原始 jpg 区域外 20 像素的结果将是透明的。 -
您可以使用 CSS 使白色像素透明:请参阅此答案:stackoverflow.com/a/34297963/273403
标签: php image image-processing jpeg opencart