在 JPEG 上重叠透明 PNG

Overlap transparent PNG over JPEG

我正在尝试通过在 jpeg 上合并透明 png 来创建 jpeg 文件。 我试过网络和其他问题,但没有找到我要找的东西。 下面的代码在我的本地环境中成功运行,但是一旦我将它上传到我的服务器[Godaddy/Linux],png 的透明背景就会变成白色,从而覆盖 jpeg。 我曾尝试按照 here 的建议使用 'imagecopyresampled' 代替 'imagecopy',但这没有用。 我在这里做错了什么吗?检查服务器 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 生成。
Image attached for one that worked.
用于生成 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 的创建方式。
对我有用的更改在那个部分。
虽然我不能完全理解原因,但这给出了我正在寻找的输出。也许我不必要地延长了编码行。
感谢我收到的意见,欢迎任何启发。


下面是我需要添加的额外片段,我从 HERE.

中找到
$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 );