我已经在一个BufferedImage存储了一个RGB图像,我想做的是采取每一种颜色(例如。并将其存储在一个新的BufferedImage中。所以在最后,我将有四个BufferedImage,最初的一个和每个颜色一个。每种颜色的每个BufferedImage应该是每像素8位,这8位包含颜色值。
我就是这么做的。
String fileName = "test.jpg";
File inFile = new File(fileName);
BufferedImage refImg = ImageIO.read(inFile);
BufferedImage redImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), BufferedImage.TYPE_BYTE_GRAY); // LINE 4
BufferedImage greenImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), refImg.getType());
BufferedImage blueImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), refImg.getType());
for (int i = 0; i < refImg.getWidth(); i++)
for (int j = 0; j < refImg.getHeight(); j++)
{
int rgb = refImg.getRGB(i, j);
int red = (rgb >> 16) & 0xFF;
int green = (rgb >> 8) & 0xFF;
int blue = rgb & 0xFF;
int ronly = (red << 16) | (0 << 8) | 0;
int gonly = (0 << 16) | (green << 8) | 0;
int bonly = (0 << 16) | (0 << 8) | blue;
redImage.setRGB(i, j, ronly);
greenImage.setRGB(i, j, gonly);
blueImage.setRGB(i, j, bonly);
}
File redOut = new File("testRed.jpg");
File greenOut = new File("testGreen.jpg");
File blueOut = new File("testBlue.jpg");
ImageIO.write(redImage, "jpg", redOut);
ImageIO.write(greenImage, "jpg", greenOut);
ImageIO.write(blueImage, "jpg", blueOut);然而,我仍然在RGB的颜色模型。当我将红色bufferedImage的类型更改为灰色(第4行)时,我没有得到红色组件。
任何帮助或指导。
发布于 2015-06-20 07:12:03
很难理解你想在这里实现什么.如果你让图像TYPE_BYTE_GRAY,它们将是灰色的。
此外,如果您想要存储为JPEG,您必须选择单通道灰色或3通道RGB。你不能有单一通道的红/绿/蓝。
所以,你基本上有两个选择:
除了原始的RGB图像之外,您还可以有3个灰度图像,存储为灰度JPEG。您需要修改一些代码:
BufferedImage redImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
BufferedImage greenImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
BufferedImage blueImage = new BufferedImage(refImg.getWidth(), refImg.getHeight(), BufferedImage.TYPE_BYTE_GRAY);..。
int ronly = (red << 16) | (red << 8) | red;
int gonly = (green << 16) | (green << 8) | green;
int bonly = (blue << 16) | (blue << 8) | blue;
redImage.setRGB(i, j, ronly);
greenImage.setRGB(i, j, gonly);
blueImage.setRGB(i, j, bonly);这些图像将分别包含红色、绿色和蓝色通道,但默认情况下它们将显示为灰色。如果需要,您可以使用LookupOp将图像转换为全红色/绿色/蓝色RGB,以便显示。
另一种方法是有3个RGB图像,只包含红色、绿色和蓝色(就像你最初的尝试一样)。这些图像将是RGB,有3个通道,并存储为RGB (很可能是YCbCr )JPEG。
第三种选择是使用全红色/绿色/蓝色(256个色调)调色板IndexColorModel。但是JPEG不能存储调色板/索引图像,因此必须将它们转换回RGB,或者您可以将文件格式更改为PNG、GIF或BMP。
https://stackoverflow.com/questions/30929714
复制相似问题