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

时间:2014-02-24 06:52:31

标签: java bufferedimage javax.imageio

**重要更新,见下文! **

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

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

Color purple = new Color(82, 0, 99);
int PURPLE = purple.getRGB();

然后我将想要从File中修改的图像读入名为“blank”的BufferedImage:

BufferedImage blank = ImageIO.read(new File("some path"));

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

blank.setRGB(x, y, PURPLE);

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

File output = new File("some other path");
ImageIO.write(blankIn, "png", output); // try-catch blocks intentionally left out

生成的文件应为“空白”,并带有一些紫色像素,但所讨论的像素为黑色。我知道问题是setRGB而不是任何导入或导出函数,因为“blank”本身就是一个彩色图像,并且这样写入文件。我阅读并看到很多帖子建议我使用Graphics2D并避免使用setRGB,但没有讨论像素逐个颜色的变化。

我也尝试过直接位操作,如下所示:

blank.setRGB(x, y, ((82 << 16) + (0 << 8) + 99));

我可能做错了,但如果我把它正确放入它就无所谓了,因为当我这样做时,像素被设置为透明(无论数字说什么,这很奇怪,对于至少说)。

**当我尝试这个时:

blank.setRGB(x, y, Color.RED.getRGB());

我的输出文件是灰度的,这意味着setRGB实际上是以灰度方式修改我的图片。我认为这实际上是一个相当简单的问题,但解决方案使我无法解决。

2 个答案:

答案 0 :(得分:3)

根据您发现自己https://stackoverflow.com/a/21981173中的见解......(发布问题后几分钟)......似乎只需将图像直接转换为ARGB就足够了加载:

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;
}

答案 1 :(得分:1)

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

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

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

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"))之后添加此内容。