【问题标题】:ImageNew toBase64 encoding issue with loss of quality in ColdFusionImageNew toBase64 编码问题与 ColdFusion 中的质量损失
【发布时间】: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 正确提取数据首先可以解决问题。
  • 也许将其作为错误或增强功能提交并让 Adob​​e 在未来版本中更改当前行为是个好主意,因为大多数想要使用 toBase64(image) 的人都想要实际的 blob。跨度>

标签: coldfusion coldfusion-9


【解决方案1】:

【讨论】:

  • 这适用于我的测试 - 似乎 ImageGetBlob 正确提取了 PNG 数据,因此 toBase64 正在转换正确的数据。
  • 不是我的问题。 :P 但是,是的,我认为 Spark 会看到并做到这一点。
  • 如果imageNew() 仍在以某种方式降低您的PNG,您可以使用答案中发布的网址中概述的fileReadBinary()
  • 非常感谢,我在本地的测试现在显示了它们应该如何。我使用 imageNew() 函数,即使使用 toBase64(imageGetBlob(myImg)) 仍然显示得很糟糕。所以正如你所说的彼得,这一定是 cf 图像对象的问题。
  • 最后一件事,有没有人用 jpg 尝试过同样的测试?图像质量最差。 imageGetBlob() 函数似乎只能正确提取 PNG 数据。如果初始图像是 jpg 它仍然非常糟糕,如果不是比添加 imageGetBlob() 修复之前更糟糕的话。我可以用 fileReadBinary 解决这个问题(根本不使用 cf 图像对象),但这里似乎发生了更多事情。我现在 100% 同意 imageNew() 的问题。
【解决方案2】:

我看到没有人提到自版本 8 以来 ColdFusion 中的 imageWriteBase64() 函数。我不知道为什么。

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-796b.html

我这周第一次使用它,它看起来很棒。我没有注意到质量损失的任何问题。

<cfdirectory action="list" directory="#expandPath('./images')#" name="imageDir" type="file" />

<cfloop query="imageDir">
    <cfset ext = listLast(imageDir.name, ".") />
    <cfset name = imageDir.name />
    <cfset imagePath = imageDir.directory & "/" & name />

    <cfset imageFile = imageNew(imagePath) />

    <cfset imageWriteBase64(imageFile,"#expandPath('./base64')#/#name#.txt",ext, true) />   
</cfloop>

【讨论】:

  • 我猜原因是因为通常他们希望将 base64 字符串放在变量中,以便他们可以嵌入data: 或持久保存到数据库。尽管您可以将其写入并读回,甚至可能是 CF9 的 ram://,但与 toBase64(imageGetBlob(myImg)) 相比,它只是要跳过更多的圈子
  • 是的,我需要它是要流式传输的 base64 字符串。我可以写到 ram 但买不起服务器资源。如果您使用 Jason 的示例显示 jpg 如果它实际上会给出相同的结果,那么看到它会很有趣!我什至没有注意到,直到它在高分辨率显示器上向我指出!不久前我做了一些搜索,发现了一个“可能”与这个问题有关的旧 Cf 错误,但现在它看起来更像是 cf 创建的对象而不是 64 转换:webmasterkb.com/Uwe/Forum.aspx/coldfusion-db/4949/…
  • 对此进行测试,确实存在质量损失。它们的质量损失可能不是视觉上的,但它就在那里,您可以通过文件大小来判断。获取原始图像,然后以应有的格式写入新文件,您将看到输出与输入大小的差异。我这样做了,这让我疯了为什么。您还可以访问任何“Image to Base64”网站并进行在线转换,并查看 Base64 字符串的差异。试试这个https://www.imgtobase64.com/ 或任何其他你可以进行网络搜索的。
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多