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



**重要更新,请参阅下面的内容!**

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

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

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

然后,我读取了我想从文件更改为缓冲图像的图像,称为"空白":

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

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

blank.setRGB(x, y, PURPLE);

现在,将"blank"写入磁盘。

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

生成的文件应该是"空白"的,有一些紫色像素,但有问题的像素是黑色的。我知道问题出在setRGB上,而不是任何导入或导出函数上,因为"空白"本身就是一个彩色图像,并被写入到文件中。我四处阅读,看到很多帖子建议我使用Graphics2D,避免设置RGB,但没有讨论逐像素的颜色变化。

我也尝试过直接的比特操作,比如:

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

我可能做错了,但如果我输入正确,那也没关系,因为当我这样做时,像素会被设置为透明(不管数字是什么,至少可以说这很奇怪)。

**当我尝试这个:

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

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

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

导入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"))之后添加此项。

相关内容

最新更新