首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cfimage将图像保存为渐进的jpg?

如何使用cfimage将图像保存为渐进的jpg?
EN

Stack Overflow用户
提问于 2015-12-09 12:24:05
回答 1查看 871关注 0票数 3

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

我可以看到指定quality的选项,但我看不到任何东西可以将jpg保存为渐进的,甚至是优化的。我希望进步,因为它给人的印象是更快地加载到页面上。

有可能这样做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-12 05:24:11

CFImage不支持立即编写进步的jpegs。据我所读,它在某种程度上是支持java。然而,这是一个很大的话题。因此,这绝不是一个完整的答案,只是一个起点。

Java

我对jpeg格式的了解是相当初级的,但是用java创建一个基本的、渐进的jpeg似乎非常简单:

  1. 获取JPEG编写器的实例
  2. 初始化图像参数和输出设置
  3. 从CF映像对象中提取底层BufferedImage
  4. 将新的jpeg写入磁盘

一种看到它的行动的方法是使用Fiddler2模拟慢速连接。在“规则”>“性能”下,选择“模拟调制解调器速度”和“禁用缓存”。

示例:

代码语言:javascript
复制
    // 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杰佩特朗ImageMagic等外部工具一起使用。它们都支持渐进式的jpegs和其他定制选项。例如,jpegtran通过扫描文件支持定制,这提供了大量的控制。(不幸的是,我还没有把我的头完全集中在那些……)先用默认设置试一试。这些可能对你的目的来说已经足够了。

代码语言:javascript
复制
<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" 
    ... 
 >

顺便说一下,我在研究时遇到了一个有趣的工具:JPEG扫描杀手。它并不用于创建进步的jpegs,但它确实有助于解释它们是如何生成的,以及扫描在流程中的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34178759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档