重叠JPEG上的透明PNG

时间:2016-04-26 09:57:19

标签: php image-processing png jpeg gd

我正在尝试通过在jpeg上合并透明png来创建jpeg文件。 我试过网和&其他问题但我找不到我想要的东西。 下面的代码在我的本地环境中成功运行,但是一旦我将它上传到我的服务器[Godaddy / Linux],png的透明背景变为白色,因此覆盖了jpeg。 我尝试使用'imagecopyresampled'代替'imagecopy',如建议的here,但这不起作用。 我在这里做错了吗?检查服务器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 );

2 个答案:

答案 0 :(得分:0)

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

$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);

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

答案 1 :(得分:0)

问题解决了!正如我在编辑中猜到的那样,问题在于如何创建透明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 );