在 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 );
我正在尝试通过在 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 );