如何使用cfimage将图像保存为渐进式jpg?
How to use cfimage to save image as progressive jpg?
我正在使用 ColdFusion 的 <cfimage>
调整图像大小,然后在服务器上另存为 #imagename#.jpg
。
我可以看到指定 quality
的选项,但我看不到任何将 jpg 保存为渐进式或什至优化的内容。我喜欢渐进式,因为它给人一种页面加载速度更快的感知印象。
这可以吗?
CFImage 不支持开箱即用地编写渐进式 jpeg。根据我的阅读,它在某种程度上是 supported in java。然而,这是一个大的话题。所以这绝不是一个完整的答案,只是一个起点。
Java
我对 jpeg 格式的了解非常初级,但在 java 中创建基本的渐进式 jpeg 似乎非常简单:
- 获取 JPEG 写入器实例
- 初始化图像参数和输出设置
- 从CF图像对象中提取底层BufferedImage
- 将新的 jpeg 写入磁盘
查看操作的一种方法是 using Fiddler2 to simulate a slow connection。在规则 > 性能下,select "Simulate Modem speeds" 和 "Disable Caching".
示例:
// 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 or ImageMagic. Both support progressive jpegs and additional options for customization. For example, jpegtran supports customization though 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>
调整图像大小,然后在服务器上另存为 #imagename#.jpg
。
我可以看到指定 quality
的选项,但我看不到任何将 jpg 保存为渐进式或什至优化的内容。我喜欢渐进式,因为它给人一种页面加载速度更快的感知印象。
这可以吗?
CFImage 不支持开箱即用地编写渐进式 jpeg。根据我的阅读,它在某种程度上是 supported in java。然而,这是一个大的话题。所以这绝不是一个完整的答案,只是一个起点。
Java
我对 jpeg 格式的了解非常初级,但在 java 中创建基本的渐进式 jpeg 似乎非常简单:
- 获取 JPEG 写入器实例
- 初始化图像参数和输出设置
- 从CF图像对象中提取底层BufferedImage
- 将新的 jpeg 写入磁盘
查看操作的一种方法是 using Fiddler2 to simulate a slow connection。在规则 > 性能下,select "Simulate Modem speeds" 和 "Disable Caching".
示例:
// 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 or ImageMagic. Both support progressive jpegs and additional options for customization. For example, jpegtran supports customization though 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,但它确实有助于解释它们的生成方式以及扫描在该过程中的位置。