在 JPEG 上重叠透明 PNG


Overlap transparent PNG over JPEG

我正在尝试通过将透明的png合并到jpeg上来创建jpeg文件。我尝试了网络和其他问题,但没有找到我要找的东西。下面的代码在我的本地环境中成功运行,但是一旦我将其上传到我的服务器[Godaddy/Linux],png的透明背景就会变成白色,从而覆盖jpeg。我尝试使用"图像复制重新采样"代替此处建议的"图像复制",但这不起作用。我在这里做错了什么吗?已检查服务器GD,已安装。任何建议将不胜感激。

$dest = imagecreatefromjpeg($jpegFileURL);
$src = imagecreatefrompng($pngFileURL);
list($destWidth, $destHeight) = getimagesize($jpegFileURL);
list($srcWidth, $srcHeight) = getimagesize($pngFileURL);
/***
 * create base image
 */
$base_image = imagecreatetruecolor($destWidth,$destHeight);
/***
 * make $base_image transparent
 */
imagealphablending($base_image, false);
$col = imagecolorallocatealpha($base_image,255,255,255,127);
imagefilledrectangle($base_image,0,0,$destWidth,$destHeight,$col);
imagealphablending($base_image,true);
imagesavealpha($base_image, true);
/***
 * Copy JPEG & then PNG over JPEG
 */
imagecopy($base_image, $dest, 0, 0, 0, 0, $destWidth, $destHeight);
imagecopy($base_image, $src, 0, 0, 0, 0, $srcWidth, $srcWidth);
/***
 * Output the file
 */
header('Content-Type: image/jpeg');
imagejpeg($base_image,$urlToSave);
imagedestroy($dest);
imagedestroy($src);

<小时 />编辑:这里使用的 jpeg 和 png 也是由脚本生成的,然后我在这里使用它来合并.
为了确保文件生成不是问题,我使用一个具有透明背景的 png 进行了测试,而不是由我的代码生成的,它工作了。
因此,我猜测问题可能来自png一代.
附上一个有效的图像。
用于生成 png 的代码。

$image = imagecreatefromjpeg( $fileJpegURL );
imagealphablending($image, true);
$transparentcolour = imagecolorallocate($image, 255,255,255);
imagecolortransparent($image, $transparentcolour);
header( 'Content-Type: image/png' );
imagepng( $image, $pngFileSavePath, 1 );

你的很多代码是不必要的,但除此之外它就可以工作了。 它可以简化为:

$dest = imagecreatefromjpeg($jpegFileURL);
$src = imagecreatefrompng($pngFileURL);
list($srcWidth, $srcHeight) = getimagesize($pngFileURL);
/***
* make $base_image transparent
*/
imagealphablending($dest, true);
/***
* Copy JPEG & then PNG over JPEG
*/
imagecopy($dest, $src, 0, 0, 0, 0, $srcWidth, $srcWidth);
/***
* Output the file
*/
imagejpeg($dest, $urlToSave);
imagedestroy($dest);
imagedestroy($src);

验证在服务器上运行脚本时没有错误。

问题已解决!正如我在编辑中猜测的那样,问题在于如何创建透明 png.
对我有用的更改在该部分.
虽然我不完全能够理解原因,但这给了我正在寻找的输出。也许我不必要地延长了编码线。
感谢我收到的投入,欢迎任何启发.


下面是我需要添加的额外片段,我从这里找到。
$image = imagecreatefromjpeg( $fileJpegURL );
imagealphablending($image, false); //-- Change Here
//-- 3 New lines added
$transparency = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparency);
imagesavealpha($image, true);
$transparentcolour = imagecolorallocate($image, 255,255,255);
imagecolortransparent($image, $transparentcolour);
header( 'Content-Type: image/png' );
imagepng( $image, $pngFileSavePath, 1 );