【问题标题】:Performing setRGB on BufferedImage changes pixel to black instead of color在 BufferedImage 上执行 setRGB 将像素更改为黑色而不是颜色
【发布时间】:2014-02-24 06:52:31
【问题描述】:

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

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

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

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

然后我将要更改的图像从文件读取到名为“空白”的 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 而不是任何导入或导出函数,因为“空白”本身是彩色图像,因此被写入文件。我阅读并看到很多帖子建议我使用 Graphics2D 并避免 setRGB,但没有讨论逐像素颜色变化。

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

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

我可能做错了,但如果我把它放对了也没关系,因为当我这样做时像素被设置为透明(不管数字怎么说,这很奇怪,至少可以说)。

** 当我尝试这个时:

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

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

【问题讨论】:

    标签: java bufferedimage javax.imageio


    【解决方案1】:

    基于您发现自己的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;
    }
    

    【讨论】:

    • 我相信你的回答比我的效率高很多!
    【解决方案2】:

    原来导入Java的图片其实是灰度的,所以Java读入BufferedImage的时候,只是简单的把它作为灰度BufferedImage导入。通过在图像的角落添加一个很小但不易察觉的彩色点,我能够让 Java 输出正确颜色的图像。

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

    解决方案: 使用这个 sn-p 将 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"))之后添加这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2020-04-03
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多