【发布时间】:2012-06-27 12:21:07
【问题描述】:
我正在使用 Netbeans 平台在 Java Swing 中制作桌面应用程序。我想将 16 位灰度图像转换为 RGB 图像。我该怎么做?
【问题讨论】:
-
使用
ImageJ。 -
我可以使用 LookUp Table 将 16 位 Gray_Scale 转换为 RGB 吗?如果是,那么如何使用查找表进行转换?
我正在使用 Netbeans 平台在 Java Swing 中制作桌面应用程序。我想将 16 位灰度图像转换为 RGB 图像。我该怎么做?
【问题讨论】:
ImageJ。
灰度保存在单个值中,黑色,而 RBG 保存在三个值中,红色、蓝色和绿色。你能做的最好的就是单色图像,你可以用BufferedImage类中的getRGB(x, y)方法来做。由于您的输入图像是灰度的,因此您可以从中获取三个颜色值中的任何一个,因为它们应该是相同的。然后将该值用于您选择作为单色基础的任何颜色。
这是一个红色的例子:
public BufferedImage changeToRedMonochrome(BufferedImage grayImage)
{
int width = grayImage.getWidth();
int height = grayImage.getHeight()
BufferedImage redImage = new BufferedImage(
width, height, BufferedImage.TYPE_INT_RGB);
for (int y=0; y<height; y++)
{
for (int x=0; x<width; x++)
{
Color grayColor = new Color(grayImage.getRGB);
int gray = grayColor.getRed();
int red = (gray > 127) ? 255 : gray/2;
int blue = (gray > 127 ? gray/2 : 0;
int green = (gray > 127 ? gray/2 : 0;
Color redColor = new Color(red, blue, green);
redImage.setRGB(x, y, redColor);
}
}
}
这不是完美的代码,当然您需要对其进行调整以满足您的特定需求,但这是制作单色图像的一种方法。
【讨论】:
Incompl 描述的 getRGB/setRGB 方法应该可以工作。但是,如果我没记错的话,它的性能相当差(在这种情况下,这些方法做了很多不必要的工作)。我认为在新图像上绘制并让Java优化从BufferedImage.TYPE_USHORT_GRAY到BufferedImage.TYPE_INT_RGB的转换会快得多:
int width = grayImage.getWidth();
int height = grayImage.getHeight()
BufferedImage newImage = new BufferedImage(
width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = newImage.getGraphics();
g.drawImage(grayImage, 0, 0, null);
g.dispose();
【讨论】: