首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在setRGB上执行BufferedImage会将像素变为黑色而不是颜色

在setRGB上执行BufferedImage会将像素变为黑色而不是颜色
EN

Stack Overflow用户
提问于 2014-02-24 06:52:31
回答 2查看 5.7K关注 0票数 4

**重要的最新情况,见下文**

我正在创建一个程序,当BufferedImage像素满足一组条件时,该程序将该像素更改为特定颜色。但是,当我将图像写入磁盘时,应该着色的像素却是黑色的。

首先,我使用RGB代码定义颜色:

代码语言:javascript
运行
复制
Color purple = new Color(82, 0, 99);
int PURPLE = purple.getRGB();

然后,我将想要更改的图像从一个文件转换为一个名为“BufferedImage”的“空白”:

代码语言:javascript
运行
复制
BufferedImage blank = ImageIO.read(new File("some path"));

现在,循环遍历像素,当位置(x,y)上的像素与标准匹配时,将其颜色更改为紫色:

代码语言:javascript
运行
复制
blank.setRGB(x, y, PURPLE);

现在,将“空白”写到磁盘上。

代码语言:javascript
运行
复制
File output = new File("some other path");
ImageIO.write(blankIn, "png", output); // try-catch blocks intentionally left out

结果文件应该是“空白”的一些紫色像素,但问题的像素是黑色的。我知道的一个事实是,这个问题与setRGB有关,而不是任何导入或导出函数,因为“空白”本身就是一个彩色图像,并以这样的方式写入文件。我四处阅读,看到了很多建议我使用Graphics2D和避免使用setRGB的帖子,但没有讨论逐像素的颜色变化。

我也尝试过直接的位操作,像这样:

代码语言:javascript
运行
复制
blank.setRGB(x, y, ((82 << 16) + (0 << 8) + 99));

我可能做错了,但如果我把它正确地放进去,那就无关紧要了,因为当我这样做时,像素会被设置为透明的(至少可以说,不管数字说什么,这很奇怪)。

**当我尝试这样做时:

代码语言:javascript
运行
复制
blank.setRGB(x, y, Color.RED.getRGB());

我的输出文件是灰度文件,这意味着setRGB实际上是在修改灰度图像。我认为这其实是一个相当简单的问题,但解决方案却让我无法理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 09:49:39

基于https://stackoverflow.com/a/21981173中你发现自己的洞察力.(发问后数分钟).在图像加载之后直接将其转换为ARGB似乎就足够了:

代码语言:javascript
运行
复制
public static BufferedImage convertToARGB(BufferedImage image)
{
    BufferedImage newImage = new BufferedImage(
        image.getWidth(), image.getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = newImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return newImage;
}
票数 3
EN

Stack Overflow用户

发布于 2014-02-24 07:14:17

导入到Java中的原始图像实际上是灰度图像,所以当Java将其读取到BufferedImage中时,它只是将其作为灰度BufferedImage导入。通过在图像的角落中添加一个非常小但不可察觉的彩色点,我能够让Java输出一个颜色正确的图像。

不幸的是,这只是一半的解决方案,因为我不知道如何以编程的方式解决这个问题。

解决方案:使用以下代码片段将BufferedImage从灰度转换为ARGB:

代码语言:javascript
运行
复制
BufferedImage blank2 = blank;
    // Create temporary copy of blank
blank = new BufferedImage(blank.getWidth(), blank.getHeight(), BufferedImage.TYPE_INT_ARGB);
    // Recreate blank as an ARGB BufferedImage
ColorConvertOp convert = new ColorConvertOp(null);
    // Now create a ColorConvertOp object
convert.filter(blank2, blank);
    // Convert blank2 to the blank color scheme and hold it in blank

您希望在blank = ImageIO.read(new File("some path"))之后添加此内容。

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

https://stackoverflow.com/questions/21980794

复制
相关文章

相似问题

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