【问题标题】:Should I convert BufferedImage.TYPE_4BYTE_ABGR to BufferedImage.TYPE_3BYTE_BGR?我应该将 BufferedImage.TYPE_4BYTE_ABGR 转换为 BufferedImage.TYPE_3BYTE_BGR 吗?
【发布时间】:2019-11-09 04:23:26
【问题描述】:

我正在研究图像插值,我正在使用双三次插值将 java 中的图像分辨率加倍,使用 AffinedTransformOp。我在进行放大时使用了 BufferedImageTYPE_4BYTE_ABGR。当我尝试使用ImageIO.write 保存我的高档图像时,我发现openjdk 不支持jpeg 编码TYPE_4BYTE_ABGR,所以我将这个放大图像从TYPE_4BYTE_ABGR 转换为TYPE_3BYTE_BGR。当我将它保存在文件夹中时,发现这张高档图像占用的内存比原始图像占用的内存要少(大约一半)。

所以我假设原始(输入)图像由四个通道 ARGB 表示,而高档(输出)图像采用 3 个通道 RGB,这就是内存减少的原因。

现在我的问题是我应该使用这种转换吗?
是否有一些信息丢失了?
图像质量是否保持不变?

PS:我从ImageIO 的文档中读到,当我们将ARGB 转换为RGB 时,alpha 值会被预乘到RGB 值,我认为它不应该影响图像的质量.

【问题讨论】:

  • 输入图像是否也是 jpeg 格式? Jpeg 不支持 Alpha 通道。您在编写图像时使用的质量可能比原始图像中使用的质量低得多。
  • 是的,原始图像是 jpeg 格式。我用 jpeg 写回了图像。
  • 您可能想查看这个问题,以了解如何在写出 JPEG 时设置压缩/图像质量级别:stackoverflow.com/questions/17108234/…

标签: java image image-processing rgb rgba


【解决方案1】:

我解决了我的问题并希望分享我的答案。实际上,我的原始图像的类型是灰度,原始图像的颜色空间是灰色(意味着只有一个 8 位通道),质量为 90。
当我使用 TYPE_4BYTE_ABGR 进行放大而不是使用时出现问题TYPE_BYTE_GRAY。其次,当您尝试将此图像保存在 jpeg 格式的文件中时,ImageIO.write 默认使用 75 压缩,因此图像尺寸会变小。您应该使用适合您的压缩系数,或者您应该将其保存为 PNG 格式。
您可以在 linux 中使用identify -verbos image.jpg 查看有关图像的信息,并可以查看色彩空间、图像类型和质量等
您可以查看此post,了解如何在ImageIO 中手动设置压缩质量。

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 2013-12-02
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2013-04-26
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多