2016-04-26 76 views
1

我想通过在jpeg上合并透明png来创建一个jpeg文件。 我试过网&其他问题,但我没有找到我在找什么。 下面的代码在我的本地环境中成功运行,但只要我将它上传到我的服务器[Godaddy/Linux],png的透明背景变成白色,因此覆盖了jpeg。 我曾尝试使用'imagecopyresampled'来代替'imagecopy',建议使用here,但这并不奏效。 我在这里做的事情有错吗?检查服务器GD,它已安装。 任何建议将不胜感激。通过JPEG重叠透明PNG

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

回答

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

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

+0

试过你的代码片段,在本地完美工作,但在服务器上没有运气。我运行脚本时没有错误。 –

+0

你是否检查过服务器错误日志?通常,生产站点上的“error_reporting”处于关闭状态。 – timclutton

+0

是的,检查php错误日志还检查error_reporting是。记录了其他的php错误,但上面的代码片段运行时没有记录。 –