2011-04-02 22 views
3

我正在構建一個小型的網絡應用程序,它將在上傳完成後將圖像大小調整爲不同的像素尺寸。使用CF8 cfimage標籤生成縮略圖 - 由圖像元數據引起的大文件大小

我試圖從3mb jpg圖像創建150px x 100px縮略圖,但無法獲得小於68kb的文件大小(我希望根據壓縮類型等生成4kb的文件)。

我已經用行動=「調整大小」標籤&的方法也採用了ImageResize()& imageScaleToFit()函數,但所有這些方法保留EXIF & IPTC元數據完好無損(我假定這是什麼讓縮略圖文件儘可能大)。

如果我使用沒有任何元數據的圖像,它會按照預期將縮略圖調整爲較小的文件大小。

是否有反正我可以從圖像剝離exif & IPTC元數據以減少縮略圖大小使用任何CF8的內置圖像功能?

+0

這個有用嗎? http://stackoverflow.com/questions/2863548/how-to-modify-exif-metadata-for-jpeg-images-using-coldfusion – 2011-04-02 09:36:17

+0

對不起,沒有在我的問題中澄清 - 這個應用程序將在共享主機,所以我不會有任何訪問權限運行任何系統命令或標籤。 – Mark 2011-04-04 21:42:08

回答

0

如果您願意,可以使用@Ciaran Archer上面鏈接的帖子中鏈接的命令行工具,然後編寫運行該命令的bash命令(* nix/Mac)或bat命令(Windows)命令,然後使用CFExecute運行該命令。我從來沒有真正使用CFImage或圖像元數據,所以我不能給你正確的代碼,但我所說的可能會有最好的性能,因爲你正在向文件系統輸出命令(使用文件) 。

+0

根據我上面的評論 - 謝謝反正 – Mark 2011-04-04 21:46:04

1

您可以創建一個尺寸與縮略圖相同的新圖像,並使用ImagePaste粘貼縮略圖。 ColdFusion不會使用粘貼操作保存EXIF數據。

+0

我在搜索答案時遇到了這種方法 - 問題是當我嘗試這個時,它仍然保留元數據,無論我是否將圖像的元數據設置爲image1(基本圖像)或圖像2(頂部粘貼的圖像)。 – Mark 2011-04-04 21:45:45

2

您可以使用Sanselan Java庫來刪除EXIF和IPTC元數據。下面是使用removeExifMetadata從這個庫中的代碼示例:

<cfscript> 
// setup and init the Sanselan library 
SanselanPath = arrayNew(1); 
arrayAppend(SanselanPath, expandPath("sanselan\sanselan-0.97-incubator.jar")); 
javaloader = createObject("component", "javaloader.JavaLoader").init(SanselanPath); 

// setup your source and destination image 
pathToInFile = ExpandPath("myImage.jpg"); 
pathToOutFile = ExpandPath("MyImagewoEXIF.jpg"); 
inFile = javaloader.create("java.io.FileInputStream").init(pathToInFile); 
outFile = javaloader.create("java.io.FileOutputStream").init(pathToOutFile); 

// create the exifRewriter 
exifRewriter = javaloader.create("org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter").init(); 

// call the method removeExifMetadata 
exifRewriter.removeExifMetadata(inFile,outFile); 
outFile.close(); 
</cfscript> 

你可以做同樣的使用iptc.JpegIptcRewriterremoveIPTC方法來刪除IPTC元數據。您可以使用CF函數ImageGetEXIFMetaData和ImageGetIPTCMetadata驗證所有內容都已被刪除。

現在我不知道,這真的會減小文件大小,讓我知道:-)

0

檢查了這一點: 使用

ImageWrite(imageObject,destination,0.9,true) returns small sized image (90% quality, overwrite="true") 

,而不是

ImageWrite(imageObject,destination,true,0.9) returns big sized image (quality="true" which is 1, overwrite="0.9" which is true) 

選擇0到1之間的質量比率以減小文件大小。

+0

不確定你的意思?在imageWrite()函數只接受3個參數 – Mark 2011-04-10 20:52:15

+0

ImageWrite(姓名,目的地,質量,覆蓋) http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-796c.html 所以使用它像我在上面提到。 – Alexey 2011-04-12 08:44:46

+0

哦,在CF8中沒有最後一個(覆蓋)參數。但無論如何,你可以設置這樣的圖像質量 ImageWrite(名稱,目的地,0.9) – Alexey 2011-04-12 09:14:01