2015-12-09 67 views
3

我使用ColdFusion的<cfimage>調整圖像大小,然後在服務器上保存爲#imagename#.jpg如何使用cfimage將圖像保存爲漸進式jpg?

我可以看到指定quality的選項,但是我看不到任何可以將jpg保存爲漸進式甚至優化的選項。我希望進步,因爲它給人一種在頁面上更快加載的感覺印象。

可以做到這一點嗎?

+1

這讓我想知道''背後的底層圖像庫是什麼,它的任何功能都可以直接使用。本頁列出了很多工具,但我不知道是否有使用。 http://stackoverflow.com/questions/2407113/open-source-image-processing-lib-in-java –

+0

@JamesAMohler - 最後我檢查了它是JAI,它不支持漸進式JPG,但是..這是一段時間前。它可能已經改變。 [這個線程](http://stackoverflow.com/questions/10976936/how-to-create-a-progressive-jpeg-image-on-android)表明它*可能會在以後的版本中被支持。 – Leigh

+0

試過了,它似乎工作,但我不知道如何測試它。 – Leigh

回答

1

CFImage不支持直接寫入漸進式jpeg。從我讀過的,在一定程度上是supported in java。但是,這是一個的話題。所以這絕不是一個完整的答案,只是一個起點。

的Java

我的JPEG格式的知識相當簡陋,但使用Java創建一個基本的漸進式JPEG似乎很直接:

  1. 搶JPEG作家的實例
  2. 初始化圖像參數和輸出設置
  3. 從CF圖像對象中提取底層BufferedImage
  4. 將新的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與像jpegtranImageMagic外部工具。兩者都支持漸進式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,但它確實有助於解釋它們是如何生成的以及掃描適合進程的位置。

相關問題