coldfusion - 如何使用cfimage将图像保存为渐进式jpg?

标签 coldfusion jpeg coldfusion-11

我正在使用 ColdFusion 的 <cfimage>调整图像大小,然后另存为 #imagename#.jpg在服务器上。

我可以看到指定 quality 的选项但我看不到任何将 jpg 保存为渐进式甚至优化的内容。我喜欢渐进式,因为它给人一种页面加载速度更快的感知印象。

这有可能吗?

最佳答案

CFImage 不支持开箱即用地编写渐进式 jpeg。据我所知,它是 supported in java在某种程度上。然而,这是一个话题。所以这绝不是一个完整的答案,只是一个起点。

Java

我对 jpeg 格式的了解非常初级,但在 java 中创建基本的渐进式 jpeg 似乎非常简单:

  1. 获取 JPEG writer 的实例
  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,但它确实有助于解释它们的生成方式以及扫描在该过程中的位置。

关于coldfusion - 如何使用cfimage将图像保存为渐进式jpg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178759/

相关文章:

javascript - 如何将jpeg字符串转换为base64

jquery - Chrome 上的 CFM 与 HTML 中的网站呈现方式不同

tomcat - 404 处理程序卡在 ColdFusion 10 上,在 ColdFusion 8 上完美运行

coldfusion - ColdFusion 9 标准版获取正在运行的请求列表

coldfusion - 执行锁定步骤后无法更新 ColdFusion

coldfusion - queryExecute 函数中的 queryOptions 有哪些选项?

c# - Coldfusion - 如何实时更新表格单元格?

html - 如何显示 JPG 图像以便首先显示非常低的分辨率?

actionscript-3 - 在加载过程中在 Flash 中显示渐进式 JPEG