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

vol*_*one 4 coldfusion image coldfusion-11

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

因此,用户首先提供图像所在位置的URL,并cfhttp用于读取它:

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

所以现在UserImg是用户想要上传的图像.接下来我们按照惯例设置抗锯齿,我也希望背景为白色,因为图像可以具有透明背景:

<cfset ImageSetAntialiasing(UserImg, "on")>
<cfset ImageSetBackgroundColor(UserImg, "white")>
Run Code Online (Sandbox Code Playgroud)

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

<cfimage source="#UserImg#" action="write" destination="pathtoimages/userimage.jpg" overwrite="yes" format="jpg" />
Run Code Online (Sandbox Code Playgroud)

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

原始图片: 原始的png图像

jpg转换后: 转换为jpg图像

我该如何解决这个问题?

Lei*_*igh 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)>
Run Code Online (Sandbox Code Playgroud)

  • 真是太棒了.工作到底是怎么回事谢谢Leigh :) (2认同)