我使用ColdFusion的<cfimage>
調整圖像大小,然後在服務器上保存爲#imagename#.jpg
。如何使用cfimage將圖像保存爲漸進式jpg?
我可以看到指定quality
的選項,但是我看不到任何可以將jpg保存爲漸進式甚至優化的選項。我希望進步,因爲它給人一種在頁面上更快加載的感覺印象。
可以做到這一點嗎?
我使用ColdFusion的<cfimage>
調整圖像大小,然後在服務器上保存爲#imagename#.jpg
。如何使用cfimage將圖像保存爲漸進式jpg?
我可以看到指定quality
的選項,但是我看不到任何可以將jpg保存爲漸進式甚至優化的選項。我希望進步,因爲它給人一種在頁面上更快加載的感覺印象。
可以做到這一點嗎?
CFImage不支持直接寫入漸進式jpeg。從我讀過的,在一定程度上是supported in java。但是,這是一個大的話題。所以這絕不是一個完整的答案,只是一個起點。
的Java
我的JPEG格式的知識相當簡陋,但使用Java創建一個基本的漸進式JPEG似乎很直接:
看到它的一種行爲方式是using Fiddler2 to simulate a slow connection。在規則>性能下,選擇「模擬調制解調器速度」和「禁用緩存」。
實施例:
// Create your CF image object
yourCFImage = imageNew("c:\path\input.jpg");
// ... resizing and other stuff
// Grab a JPEG writer. Validation omitted for brevity
// In real code, verify writer exists and progressives is supported first
// ie jpegWriters.hasNext() and imageParam.canWriteProgressive()
ImageIO = createObject("java", "javax.imageio.ImageIO");
jpegWriters = ImageIO.getImageWritersByFormatName("jpg");
writer = jpegWriters.next();
imageParam = writer.getDefaultWriteParam();
// Where to save new image on disk
destinationFile = createObject("java", "java.io.File").init("c:\path\outut.jpg");
destinationStream = ImageIO.createImageOutputStream(destinationFile);
// Parameters for desired image quality and interlacing
// NB: Compression type support varies (JPEG-LS, ...)
// Check availability with getCompressionType()
writer.setOutput(destinationStream);
imageParams = writer.getDefaultWriteParam();
imageParams.setCompressionMode(imageParams.MODE_EXPLICIT);
imageParams.setCompressionQuality(javacast("float", 0.80)); // 80%
imageParams.setProgressiveMode(imageParams.MODE_DEFAULT);
// Write the new image to disk
buffImage = ImageGetBufferedImage(yourCFImage);
IIOImage = createObject("java", "javax.imageio.IIOImage");
imageToSave = IIOImage.init(buffImage, javacast("null", ""), javacast("null", ""));
writer.write(javacast("null", ""), imageToSave, imageParams);
// Cleanup object
destinationStream.flush();
destinationStream.close();
writer.dispose();
外部工具
另一種選擇是使用cfexecute
與像jpegtran或ImageMagic外部工具。兩者都支持漸進式jpeg和額外的自定義選項。例如,jpegtran支持定製,儘管scan files提供了很多控制。 (不幸的是,我還沒有把我的頭圍繞在那些......)。首先嚐試使用默認設置。這些可能足以滿足您的目的。
<cfexecute name="C:\Program Files\ImageMagick-6.9.2-Q16\convert.exe"
arguments=" -interlace line -quality 85 c:\path\source.jpg c:\path\output.jpg"
...
>
順便說一句,我碰到一個有趣的工具來了,而研究:JSK (JPEG Scan Killer)。它並不適用於創建漸進式jpeg,但它確實有助於解釋它們是如何生成的以及掃描適合進程的位置。
這讓我想知道''背後的底層圖像庫是什麼,它的任何功能都可以直接使用。本頁列出了很多工具,但我不知道是否有使用。 http://stackoverflow.com/questions/2407113/open-source-image-processing-lib-in-java –
@JamesAMohler - 最後我檢查了它是JAI,它不支持漸進式JPG,但是..這是一段時間前。它可能已經改變。 [這個線程](http://stackoverflow.com/questions/10976936/how-to-create-a-progressive-jpeg-image-on-android)表明它*可能會在以後的版本中被支持。 – Leigh
試過了,它似乎工作,但我不知道如何測試它。 – Leigh