将具有透明度的png图像转换为jpg会破坏图像

时间:2016-01-26 21:09:30

标签: image coldfusion coldfusion-11

我正在尝试将用户上传的任何图片转换为具有白色背景的jpg格式。但是,我注意到当用户上传包含透明度的PNG图像时,ColdFusion会破坏整个图像。这几乎看起来正在发生数字腐败。

因此,用户首先提供图片所在位置的网址,并使用cfhttp进行阅读:

<cfhttp url="http://pathtoimage/image.png" method="get" useragent="#CGI.http_user_agent#" getasbinary="yes" result="PageResult">
<cfimage name="UserImg" source="#PageResult.FileContent#" />

所以现在UserImg是用户想要上传的图片。接下来我们通常会设置抗锯齿功能,我也希望背景为白色,因为图像可能具有透明背景:

<cfset ImageSetAntialiasing(UserImg, "on")>
<cfset ImageSetBackgroundColor(UserImg, "white")>

最后一步是将其作为jpg文件写入服务器:

<cfimage source="#UserImg#" action="write" destination="pathtoimages/userimage.jpg" overwrite="yes" format="jpg" />

问题是具有透明度的PNG图像完全毁了。什么应该有一个白色的背景,并成为一个明确的jpg图像最终所有块状与黑色背景。这是一个例子:

原始图片: original png image

jpg转换后: converted to jpg image

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

ImageSetBackgroundColor在该代码中无效。根据文件:

  

设置ColdFusion图像的背景颜色。 背景   颜色用于清除区域。仅设置背景颜色   影响后续的ImageClearRect调用。

由于标准jpeg不支持透明度,因此当图像保存为jpeg时,部分透明区域基本上会转换为黑色。

相反,请尝试将透明PNG粘贴到具有白色背景的新图像上。然后对新图像进行转换。

<!--- use "rgb" to make background opaque --->
<cfset UserImgCopy = ImageNew("", UserImg.Width, UserImg.Height, "rgb", "white")>
<cfset ImagePaste(UserImgCopy, UserImg, 0, 0)>
<cfset ImageWrite(UserImgCopy, "c:\path\userimage.jpg", true)>