2015-12-09 42 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,但它确实有助于解释它们是如何生成的以及扫描适合进程的位置。

相关问题