java jpeg压缩算法_在创建JPEG时,我可以更改Java的ImageWriter使用的压缩算法吗?

“Java’s ImageWriter’s .write() method produces sub-par results for JPEG

images (as compared to Photoshop “Save for Web”, as an example).”

出现这种情况的原因不止一个,将Java imageio生成的图像质量与专业图像软件作为photoshop进行比较是不公平的.

无论如何,让我们看看图像中的工件最可能的原因是:通常对于将图像保存为JPEG的软件,它将允许用户指定参数作为压缩或质量,一个是另一个的反转.该参数用于缩放量化过程中使用的量化表,这是JPEG丢失的最重要因素.不同的编码器可以使用不同的量化表,其部分地考虑图像质量差异.

但是可能存在影响压缩和图像质量的其他因素,其中色度子采样(或下采样)实际上在量化过程之前发生.色度子采样是以比原始分辨率更低的分辨率对图像中的颜色信息进行采样的过程.有关更好的解释,请阅读this文章.

Calvin Hass提供了一个优秀的JPEG阻尼工具,名为JPEGSnoop,可以从http://www.impulseadventure.com下载.在你提供的ps75.jpg图像上使用这个工具,我发现以下输出与色度子采样有关:

Component[1]: ID=0x01, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)

Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cb)

Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cr)

这意味着没有对颜色组件进行子采样.另一方面,100.jpg和75.jpg的子排列部分是相同的:

Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)

Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cb)

Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cr)

这意味着通过取两个连续像素的平均值,在颜色分量的水平和垂直方向上进行了二次调整.

当原始图像由条带和/或正方形组成时,色度子采样对图像质量的影响将是最显着的,并且您已经注意到这里的工件更容易被看到.

因此,IMO,对于这种特殊情况,问题更多来自色度子采样而不是质量因子设置.也许我没有挖得足够深,但是我找不到设置imageio的采样因子或者它背后的ImageWriter(最有可能是com.sun.imageio.plugins.jpeg.JPEGImageWriter)的方法,尽管它似乎可以设置ImageWriter使用的量化和Huffman表.

因此,除非您为imageio编写自己的ImageWriter插件或作为独立插件,否则不太可能更改Java的ImageWriter使用的压缩算法.但考虑到JEPG压缩算法的复杂性,两者都是非平凡的.有一个相对容易遵循的James JpegEncoder实现由James R. Weeks编写,默认情况下不进行色度子采样.它曾经是免费的,但您可以通过搜索网络找到原始版本.

另一件有趣的事情是:从JPEGSnoop的输出中,photoshop保存的75%JPEG图像的实际品质因数实际上显示为92%左右.以下来自Calvin Hass网站的引用文本将回答为什么Photoshop在您的案例中不使用子采样的问题:

另外,请注意Photoshop CS2使用不同的色度子采样级别,具体取决于“保存JPEG质量”设置:

Photoshop Save As Quality 0-6 - 2x2 Chroma Subsampling

Photoshop Save As Quality 7-12 - 1x1 No Chroma Subsampling

Photoshop Save For Web Quality 0-50 - 2x2 Chroma Subsampling

Photoshop Save For Web Quality 51-100 - 1x1 No Chroma Subsampling

查看this Java图像库,它也可以编写JPEG图像.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值