2011-11-08 25 views
4

我一直有toBase64()一段時間的問題。我希望有人能告訴我爲什麼CF toBase64()似乎失去了一些東西,即在我的例子中,它降低了圖像的質量。ImageNew toBase64編碼與ColdFusion質量損失問題

我有一個解決方案(請參閱下面的最後一個代碼示例),但我討厭不理解爲什麼,並且很想解決這個問題。

如果任何人都會如此友善地運行下面的代碼,那麼在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的一個bug,請投票給錯誤3177303 https://bugbase.adobe.com/index.cfm?event=bug&id=3177303

+0

查看這裏的示例輸出:http://i56.tinypic.com/29fwiq.png PS我指出下面的肖恩,這與「質量」屬性無關,我只在我的例子中使用了cfimage進行示範。這個問題似乎與CF的toBase64的實現有關。 – Prometheus

+1

這沒有任何意義,但是你說得對,錯誤在'toBase64'函數中 - 即'toBase64(ImageObject)'產生JPEG文件,即使原始文件是PNG。這應該在[cfbugs.adobe.com](http://cfbugs.adobe.com)(http://cfbugs.adobe.com)報告 –

+0

我已經添加了另一個示例,顯示這與cfimage無關(儘管默認格式是PNG) 。 –

回答

1

我認爲沒有人提到自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> 
+1

我想這是因爲他們通常希望在變量中使用base64字符串,以便他們可以嵌入'data:'或持久化到數據庫。雖然你可以寫它並讀回來,甚至可能是'ram://'爲CF9,它只是比'toBase64(imageGetBlob(myImg))跳過更多'' – Henry

+0

是的,我需要它是一個base64串流。我可以寫信給ram,但無法承擔服務器資源。如果你使用Jason的例子顯示一個jpg,如果它實際上會給出相同的結果,那麼看到tho會很有趣!我甚至沒有注意到,直到它在高分辨率顯示器上被指出來了!我做了一些搜索,發現一箇舊的Cf錯誤,可能與這個問題有關,現在看起來更像是cf創建的對象,而不是64位轉換:http://www.webmasterkb.com/Uwe/ Forum.aspx/ColdFusion的-DB/4949/CF-的Base64不相容至A-Java的Base64編碼 – Prometheus