是否有人可以告诉我如何在java中使用lossless
压缩来编写'jpeg'文件?
我使用下面的代码读取字节来编辑字节
WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
我需要再次将字节写为'jpeg'文件而不压缩lossy
。
答案 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的应用程序都无法使用这些功能。