我正在尝试将用户上传的任何图片转换为具有白色背景的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图像最终所有块状与黑色背景。这是一个例子:
我该如何解决这个问题?
答案 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)>