如何在java中使jpeg无损?

时间:2011-10-01 07:36:23

标签: java jpeg lossless-compression lossless

是否有人可以告诉我如何在java中使用lossless压缩来编写'jpeg'文件?

我使用下面的代码读取字节来编辑字节

WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();

我需要再次将字节写为'jpeg'文件而不压缩lossy

1 个答案:

答案 0 :(得分:8)

JAI包提供了保存“无损JPEG”格式的功能。根据您想要的变体,将压缩类型设置为JPEG-LS or JPEG-LOSSLESS

我不确定你真的想要无损JPEG。这是一种单独的格式,与普通的JPEG格式并没有多大关系。一般而言,它并非得到很好的支持;对于无损图像存储,你通常会使用像PNG这样的东西。

如果你需要进行无损图像转码(即你可以在不干扰DCT矩阵边界的情况下进行裁剪和旋转操作的集合),你通常会使用jpegtran命令进行,因为没有据我所知,目前是一个Java绑定到IJG库。

ETA:

  

你知道怎么用JAI做。

我自己没有尝试过(下面的代码未经测试),但它应该是对setCompressionType的直接调用。 (当然,Java中的'直截了当'仍然意味着在迷宫般的小对象中进行协商,以便在其他任何地方设置简单的切换:)

ImageWriter writer= (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param= writer.getDefaultWriteParam();
param.setCompressionMode(param.MODE_EXPLICIT);
param.setCompressionType("JPEG-LS");
writer.setOutput(ImageIO.createImageOutputStream(new File(path)));
writer.write(null, new IIOImage(image, null, null), param);

JPEG-LS是较新的无损JPEG标准。它比原来的JPEG-LOSSLESS标准压缩得更多,但支持更差。大多数支持JPEG的应用程序都无法使用这些功能。