将带透明度的png图像转换为jpg格式会破坏图像。

4
我将尝试将用户上传的任何图像转换为带有白色背景的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#" />

所以现在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 如何解决这个问题?

你使用的 ColdFusion 版本是哪个?你确定它支持这种转换吗? - James A Mohler
ColdFusion 11。Leigh的答案有效。 - volume one
1个回答

8

在这段代码中,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)>

2
太棒了。完全按照我的要求工作,谢谢Leigh :) - volume one
1
我曾经遇到过图像太大,导致ColdFusion无法在内存中处理(Java堆错误)的问题。 我使用GraphicsMagick(免费)与ColdFusion 8-11,并使用命令行语法将PNG转换为JPG,使用白色背景是 gm convert -transparent white -extent 0x0 #PNGPathIn# #JPGPathOut# - James Moberg
是的,鉴于其内存占用量可能很高,CF/Java并不总是图像处理的最佳工具。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接