【问题标题】:How to convert an indexed image to a RGB image in Java?如何在 Java 中将索引图像转换为 RGB 图像?
【发布时间】:2013-10-25 09:28:42
【问题描述】:

我有一个彩色索引 TIFF 图像(8 位),我想将其转换为 RGB 24 位图像(未索引)。这样做的方法是什么?

我正在使用 JMagick。以一种奇怪的方式,它适用于我使用时为灰度的索引 8 位图像:

image.transformRgbImage(info.getColorspace());

即使图像,虽然不再被索引,但在那之后仍然是 8 位,这很幸运,因为它是灰度的,实际上应该是 8 位的。奇怪的是 transformRgbImage() 执行该操作,尽管我更希望它将图像转换为 24 位图像。总之……

同样的方法不适用于彩色索引的 8 位图像。我只是不知道如何使用 JMagick API 来实现这个目标。我试过设置:

image.setDepth(24);

或:

info.setDepth(24);

但两者都会导致 EXCEPTION_ACCESS_VIOLATION。当我设置时:

info.setDepth(32);

没有例外,1) 但图像是 32 位的,这不应该是,2) 它是全黑的(1 种唯一颜色)。为什么 setDepth(24) 会引发这样的异常?我该怎么办?

提前感谢您的帮助。

【问题讨论】:

  • 你的图片有透明度吗? 24 位和 32 位之间的唯一区别是透明度。索引图像还支持透明度(透明像素的一个索引)。
  • 我不认为...我得到的唯一软件是 GIMP,它不会像透明通道那样将背景显示为格子图案。另外,我的图像是 TIFF。 TIFF 不能有透明颜色,可以吗?

标签: java image imagemagick rgb jmagick


【解决方案1】:

我不知道 jmagick,但通常一旦你创建了一个图像对象,它的属性是固定的(大小和颜色模型)。

您不更改图像属性,而是创建具有所需目标属性的图像并将原始图像绘制到新图像中。在普通的核心 java 中,您只需这样做:

public BufferedImage toRGB(Image i) {
    BufferedImage rgb = new BufferedImage(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB);
    rgb.createGraphics().drawImage(i, 0, 0, null);
    return rgb;
}

【讨论】:

  • 我一直在努力,而事情就是这么简单!非常感谢您的有用回答。现在我要做的是重置在此过程中丢失的分辨率和压缩设置。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2021-12-15
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多