如何在BufferedImage中用另一种颜色替换颜色?

时间:2017-05-06 22:03:52

标签: java replace colors bufferedimage

我想要做的很简单:我的图像基本上是带有alpha的单色图像。

编辑:由于我的帖子被轻微标记为重复,以下是与其他帖子的主要区别:

  1. 另一个主题的图片有几种颜色,我的只有一个
  2. 主人接受的回答是我实施的那个...而且我说我有问题,因为它太慢了
  3. 这意味着所有像素都是:

    • 白色(255; 255; 255)和透明(0 alpha)
    • 或黑色(0; 0; 0)和不透明(0到255之间的alpha)

    Alpha并不总是一样,我有不同的黑色色调。

    我的图像是使用Photoshop生成的,具有以下设置:

    • 模式:RGB颜色,8位/通道
    • 格式:PNG
    • 压缩:最小/慢
    • 交错:无

    考虑到它只有一种颜色,我想我可以使用其他模式(例如灰度可能吗?),请告诉我你是否有这方面的建议。

    我想要做的是在我的java应用程序中用另一种颜色替换黑色。

    阅读其他主题似乎改变ColorModel是一件好事,但我真的完全不知道如何正确地做到这一点。

    这是我做的:

    public Test() {
        BufferedImage image, newImage;
        IndexColorModel newModel;
    
        try {
          image = ImageIO.read(new File("E:\\MyImage.png"));
        } 
        catch (IOException e) {e.printStackTrace();}
    
        newModel = createColorModel();
        newRaster = newModel.createCompatibleWritableRaster(image.getWidth(), image.getHeight());
    
        newImage = new BufferedImage(newModel, newRaster, false, null);
        newImage.getGraphics().drawImage(image, 0, 0, null);
    }
    
    private IndexColorModel createColorModel() {
        int size = 256;
    
        byte[] r = new byte[size];
        byte[] g = new byte[size];
        byte[] b = new byte[size];
        byte[] a = new byte[size];
    
        for (int i = 0; i < size; i++) {
            r[i] = (byte) 21;
            g[i] = (byte) 0;
            b[i] = (byte) 149;
            a[i] = (byte) i;
        }
    
        return new IndexColorModel(16, size, r, g, b, a);
    }
    

    这会产生预期的结果。

    newImage与具有新颜色(21; 0; 149)的图像相同。

    但是有一个缺陷:以下行太慢了:

    newImage.getGraphics().drawImage(image, 0, 0, null);
    

    在大图像上执行此操作可能需要几秒钟,而我需要将其瞬间完成。

    我很确定我不是这样做的好方法。

    你能告诉我如何有效地实现这一目标吗?

    请考虑我的图片将始终为alpha的单色,因此欢迎提供有关图片格式的建议。

0 个答案:

没有答案