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

Converting png images with transparency to jpg is ruining the image

我正在尝试将用户上传的任何图像转换为具有白色背景的 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 图像最终都是黑色背景的块状。这是一个例子:

原图:

jpg转换后:

我该如何解决这个问题?

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

Sets the background color for the ColdFusion image. The background color is used for clearing a region. Setting the background color only affects the subsequent ImageClearRect calls.

由于标准 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)>