【问题标题】:Working with JPEG images in Java在 Java 中处理 JPEG 图像
【发布时间】:2014-03-22 02:38:45
【问题描述】:

我正在使用BufferedImage 类将图像作为像素读取,然后我使用位移将其适当的组件放入单独的 int 数组中。这工作正常。

我已使用此参考 site 对像素阵列手动执行 DCT 功能。

使用的方法:forwardDCT()quantitizeMatrix()dequantitzeMatrax()inverseDCT()

然后将其反馈到生成的图像数组中以重建 JPEG 文件,然后我使用 BufferedImage 的write() 方法将像素数据作为图像写回。

这很好用,我可以查看图像。 (我用来压缩视觉效果的值更好)。

我的问题是,有没有办法将量化系数写为 JPEG 格式的压缩值?

因为BufferedImage write()方法是用来输入像素数据的,而不是系数数据?

希望这很清楚。

谢谢

【问题讨论】:

  • 我想是的。 bufferedImage的思想是存储颜色模型和光栅,所以基本上就是一个大的位图。
  • DCT 系数不是颜色值,它们是频率值。但也许你的思路是对的,你知道如何创建一个带有系数值的 BufferedImage 构造函数吗?

标签: java jpeg bufferedimage pixels dct


【解决方案1】:

最终,DCT 计算只是整个 JPEG 编码过程中的一个步骤。一个完整的实现还必须处理量化、霍夫曼编码以及符合 JPEG 标准。

Java 实际上只是为您提供了一个 JPEG 编码器的接口,让您可以做一些有用的事情,例如保存图像。

ImageIO.write() 用于 JPEG 图像的 ImageWriter 取决于您的系统。 JPEG 的默认 ImageWriter 仅允许您使用 JPEGImageWriteParam 类 (http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageWriteParam.html) 更改一些影响量化和编码的设置。

将您手工制作的 DCT 系数放入 JPEG 文件可能需要编写整个 JPEG 库。如果您不想做所有这些工作,那么您可以修改现有库的源代码,以便它使用您的 DCT 系数。

【讨论】:

  • 好的,谢谢您的回复。很抱歉我的回复晚了。将 DCT 系数写入 JPEG 图像似乎很复杂。看着那个类,我遇到了 JPEGImageWriteParam 类,它似乎与主题更相关。但我不知道如何使用这些类将它们保存为 DCT 系数。如果您知道任何建议的方法,请告诉我?无论如何,我会给你最好的答案。再次感谢
  • 使用 JPEGImageWriteParam 最多可以使用 setEncodeTables 设置 quantization tableshuffman tables
  • ...这些决定了图像的编码方式,并且它们也是解码所必需的。 JPEGImageWriteParam 类是“描述如何对流进行编码的类”。您拥有的不是元数据或参数,而是与编码器预期不同的实际图像数据。所以这个类不会有用。我在标准库中找不到任何有帮助的类。如果您能找到实际使用的 ImageWriter 类的文档,可能会更有用。
  • 好的,谢谢。我正在使用 BufferedImage 来读取和写入像素,我可能应该使用 ImageWriter 之类的东西来更好地控制如何写出数据。但是感谢您的帮助
  • 我猜你正在使用 ImageIO.write 将 BufferedImage 保存为文件。 ImageIO.write 使用默认的 ImageWriter 类。
【解决方案2】:

在 DCT 之前。 . .

虽然 JPEG 不知道颜色,但 JPEG 文件格式使用 YCbCr 颜色空间是正常的。如果您正在考虑编写 JPEG 文件,则需要先进行此转换。

量化之后。 . .

系数是游程编码的。这是您必须添加的步骤。这是 JPEG 编码中最复杂的部分。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多