我正在尝试通过在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也是由脚本生成的,然后我在这里使用它来合并。
$image = imagecreatefromjpeg( $fileJpegURL );
imagealphablending($image, true);
$transparentcolour = imagecolorallocate($image, 255,255,255);
imagecolortransparent($image, $transparentcolour);
header( 'Content-Type: image/png' );
imagepng( $image, $pngFileSavePath, 1 );
答案 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
对我有用的改变是在那一部分
虽然我不能完全弄清楚原因,但这给了我想要的输出。也许我不必要地拉伸编码线。
感谢我收到的意见,欢迎任何启示。
$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 );