【问题标题】:How to make jpeg lossless in java?如何在java中使jpeg无损?
【发布时间】:2011-10-01 07:36:22
【问题描述】:

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

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

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

我需要再次将字节写入“jpeg”文件而不在lossy中压缩。

【问题讨论】:

  • 我不是图像处理和压缩方面的专家,但据我所知,对于一般用途,hufmman code 是无损压缩的最佳选择
  • JPEG 是一种有损编码。如果你想要无损,那么你应该使用不同的图像格式。
  • @Cameron:JPEG 有无损变体

标签: java jpeg lossless-compression lossless


【解决方案1】:

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

我不确定您是否真的想要无损 JPEG。它是一种单独的格式,与普通的 JPEG 格式没有太大关系。一般来说,它并没有得到很好的支持。对于无损图像存储,通常最好使用 PNG 之类的东西。

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

预计到达时间:

你知道如何用 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 的应用程序将无法处理这些。

【讨论】:

  • 你知道如何用 JAI 来做这件事。我在谷歌上找不到任何想法。没有示例代码。
  • 我将在隐写术中使用它。
  • ImageWriter 不是来自 JAI。它只是来自 javax.imageio 和错误 java.lang.IllegalArgumentException:未知压缩类型!从行 >> param.setCompressionType("JPEG-LS");
  • 我相信安装 JAI 会为标准 ImageIO 添加新的压缩类型。
猜你喜欢
  • 2013-06-15
  • 2015-03-10
  • 2011-09-06
  • 2010-10-16
  • 2016-11-18
  • 2014-09-28
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多