首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BufferedImage

Java BufferedImage
EN

Stack Overflow用户
提问于 2015-06-19 04:04:14
回答 1查看 1.5K关注 0票数 2

我已经在一个BufferedImage存储了一个RGB图像,我想做的是采取每一种颜色(例如。并将其存储在一个新的BufferedImage中。所以在最后,我将有四个BufferedImage,最初的一个和每个颜色一个。每种颜色的每个BufferedImage应该是每像素8位,这8位包含颜色值。

我就是这么做的。

代码语言:javascript
复制
 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行)时,我没有得到红色组件。

任何帮助或指导。

EN

回答 1

Stack Overflow用户

发布于 2015-06-20 07:12:03

很难理解你想在这里实现什么.如果你让图像TYPE_BYTE_GRAY,它们将是灰色的。

此外,如果您想要存储为JPEG,您必须选择单通道灰色或3通道RGB。你不能有单一通道的红/绿/蓝。

所以,你基本上有两个选择:

除了原始的RGB图像之外,您还可以有3个灰度图像,存储为灰度JPEG。您需要修改一些代码:

代码语言:javascript
复制
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);

..。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30929714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档