【发布时间】:2012-04-28 02:08:10
【问题描述】:
toBase64() 的问题已经有一段时间了。我希望有人能告诉我为什么 CF toBase64() 似乎丢失了一些东西,即在我的示例中它降低了图像的质量。
我有一个解决方案(请参阅下面的最后一个代码示例),但我讨厌不理解为什么并且很想解决这个问题是 CF。
如果有人愿意运行下面的代码,那么您会发现在 toBase64 转换后图像质量很差。没什么大不了的,但编码后看起来不太好。如果您从未注意到,请尝试一下,您会明白我的意思。
有谁知道为什么,或者如何在 CF 中解决这个问题?
<!--- EXAMPLE 1 --->
<!--- GET IMAGE - --->
<cfset image = ImageNew("test.png")>
<!--- BEFORE GOOD--->
<cfimage action="writeToBrowser" source="#image#" >
<cfset image = toBinary(toBase64(image)) />
<!--- AFTER --->
<cfimage action="writeToBrowser" source="#image#" >
<!--- Example 2 --->
<cfset image = ImageNew("test.png")>
<cfset FileWrite(expandPath('./converted.image'),toBinary(toBase64(image))) />
<!--- without any cfimage processing, the outputted file is a JPEG --->
我的解决方案是使用 java 插件,一切看起来都还不错,但由于某些原因,我不会进入这里而不是我可以现场做的事情。
image = createObject("java","it.sauronsoftware.base64.Base64").encode(image);
toBinary(image );
上面代码的示例图像输出可以在这里找到:http://i56.tinypic.com/29fwiq.png 首先是在 toBase64 之前,其次是在之后,您可以在第二个输出上看到经过 toBase64 函数后的图像质量有所下降。
更新: 正如 Peter 所指出的,问题似乎在于 ImageObject 中的自动输出/转换代码为 toBase64 函数提供二进制输出以进行编码。
更新我已将此作为 CF 9.0.1 中的错误提交,请为错误 3177303 投票 https://bugbase.adobe.com/index.cfm?event=bug&id=3177303
【问题讨论】:
-
在此处查看示例输出:i56.tinypic.com/29fwiq.png PS 正如我在下面向 Shawn 指出的那样,这与“质量”属性无关,我在示例中仅使用 cfimage 进行演示。问题似乎与 CF 的 toBase64 实现有关。
-
这毫无意义,但你是对的,错误在于
toBase64函数 - 即toBase64(ImageObject)会生成 JPEG 文件,即使原始文件是 PNG 也是如此。这应该报告在cfbugs.adobe.com -
我添加了另一个示例,表明这与 cfimage 无关(尽管默认格式是 PNG)。
-
呸,我不能在这里重新表述我最初的评论 - 该错误可能 不是 在 toBase64 本身中,但在 ImageObject 内的自动输出/转换代码中为
toBase64函数提供二进制输出以进行编码。正如Henry's answer 所示,使用 imageGetBlob 正确提取数据首先可以解决问题。 -
也许将其作为错误或增强功能提交并让 Adobe 在未来版本中更改当前行为是个好主意,因为大多数想要使用 toBase64(image) 的人都想要实际的 blob。跨度>