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

Image 将具有透明度的png图像转换为jpg会破坏图像,image,coldfusion,coldfusion-11,Image,Coldfusion,Coldfusion 11,我试图将用户上传的任何图像转换为带有白色背景的jpg格式。然而,我注意到,当用户上传一个包含透明度的PNG图像时,ColdFusion正在破坏整个图像。看起来好像有数字腐败正在发生 因此,用户首先提供图像所在位置的URL,并使用cfhttp读取图像: <cfhttp url="http://pathtoimage/image.png" method="get" useragent="#CGI.http_user_agent#" getasbinary="yes" result="PageR

我试图将用户上传的任何图像转换为带有白色背景的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#" />
最后一个阶段是将其作为jpg文件写入服务器:

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

问题是,具有透明度的PNG图像完全被破坏了。什么应该有一个白色的背景,是一个清晰的jpg图像结束了所有的黑色背景块状。下面是一个例子:

原始图像:

jpg转换后:


如何解决此问题?

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


您使用的是哪个版本的ColdFusion?您确定它支持此转换吗?ColdFusion 11。利的回答奏效了,太棒了。工作方式正是我想要的谢谢Leigh:)欢迎:)很高兴它能帮上忙。我遇到过这样的问题:图像太大,ColdFusion无法在内存中处理(Java堆错误)。我使用GraphicsMagick(free)w/ColdFusion 8-11和命令行语法使用白色背景将PNG转换为JPG是
gm convert-transparent white-extent 0x0#PNGPathIn##JPGPathOut#
。是的,考虑到内存密集程度,CF/java并不总是图像处理的最佳工具。
<!--- 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)>