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

Java 如何在BuffereImage中用另一种颜色替换颜色?,java,replace,colors,bufferedimage,Java,Replace,Colors,Bufferedimage,我想做的很简单:我有一个图像,基本上是一个带有alpha的单色图像 编辑:由于我的帖子被光速标记为重复,以下是与其他帖子的主要区别: 另一个主题的图像有几种颜色,我的只有一种 所有者接受的答案是我实现的答案。。。我是说我有个问题,因为它太慢了 这意味着所有像素都是: 白色(255;255;255)和透明(0 alpha) 或黑色(0;0;0)和不透明(alpha介于0和255之间) 阿尔法并不总是一样的,我有不同的黑色阴影 我的图像是使用Photoshop生成的,具有以下设置: 模式:RG

我想做的很简单:我有一个图像,基本上是一个带有alpha的单色图像

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

  • 另一个主题的图像有几种颜色,我的只有一种
  • 所有者接受的答案是我实现的答案。。。我是说我有个问题,因为它太慢了
  • 这意味着所有像素都是:

    • 白色(255;255;255)和透明(0 alpha)
    • 或黑色(0;0;0)和不透明(alpha介于0和255之间)
    阿尔法并不总是一样的,我有不同的黑色阴影

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

    • 模式:RGB颜色,8位/通道
    • 格式:PNG
    • 压缩:最小/较慢
    • 交错:无
    考虑到它只有一种颜色,我想我可以使用其他模式(比如灰度),所以告诉我你对此有什么建议

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

    在阅读其他主题时,似乎更改颜色模型是一件好事,但老实说,我完全不知道如何正确操作

    以下是我所做的:

    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);
    }
    
    在大图像上执行此操作可能需要几秒钟的时间,而我需要即时执行此操作

    我很确定我做得不好

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


    请考虑我的图像将是单色的alpha格式,所以欢迎图像格式的建议。

    如果你的输入图像总是在调色板+ alpha模式下,并且使用<代码> >索引颜色> < /> >兼容你的代码> CealCeCoRoMeod()/代码>,你应该能够做到:

    BufferedImage image ...; // As before
    
    IndexColorModel newModel = createColorModel();   
    BufferedImage newImage = new BufferedImage(newModel, image.getRaster(), newModel.isAlphaPremultiplied(), null);
    
    这将创建具有新颜色模型的新图像,但会重新使用原始图像中的光栅。不需要创建大型数据数组或图形,因此速度应该非常快。但是:请注意,
    image
    newImage
    现在将共享备份缓冲区,因此在其中一个缓冲区中绘制的任何更改都将反映在另一个缓冲区上(在您的情况下可能不是问题)


    PS:你可能需要调整你的
    createColorModel()
    方法来获得你想要的准确结果,但由于我没有你的输入文件,我不能确定它是否有效。

    如果你的输入图像始终处于调色板+alpha模式,并且使用与
    createColorModel()兼容的
    IndexColorModel
    ,您应该能够做到:

    BufferedImage image ...; // As before
    
    IndexColorModel newModel = createColorModel();   
    BufferedImage newImage = new BufferedImage(newModel, image.getRaster(), newModel.isAlphaPremultiplied(), null);
    
    这将创建具有新颜色模型的新图像,但会重新使用原始图像中的光栅。不需要创建大型数据数组或图形,因此速度应该非常快。但是:请注意,
    image
    newImage
    现在将共享备份缓冲区,因此在其中一个缓冲区中绘制的任何更改都将反映在另一个缓冲区上(在您的情况下可能不是问题)


    PS:你可能需要调整你的
    createColorModel()
    方法来获得你想要的准确结果,但是由于我没有你的输入文件,我不能确定它是否有效。

    @Andy Turner:就这些吗?我读了包括这篇文章在内的所有其他主题好几天了。我不会问我的问题,否则…@安迪·特纳:就这些吗?我读了包括这篇文章在内的所有其他主题好几天了。否则我不会问我的问题…嗨,哈拉尔德。谢谢你的回答。执行此操作时,我的colorModel和光栅之间出现兼容性错误。@是的,我预料到了。这就是为什么我写了你可能需要调整createColorModel方法的原因。但是我不知道要做什么,没有看到你的输入文件。16位的256项调色板看起来可疑。你是真的。我不记得为什么我用了16位。我想我在放8的时候遇到了问题,但是现在8起作用了,所以没问题。TBH我找到了解决这个问题的方法。现在我正在努力以一种有效的方式将所有单色图层合并成一幅多色图像。目前,我正在使用Graphics.drawImage方法将所有层绘制到一个图像中,但大约15层需要500毫秒。有什么建议吗?PS:我如何向您发送图像?@red您可以附加问题中的文件(可能需要更多代表),或者只需在您的问题中提供一个链接,指向dropbox、google drive或类似文件共享服务中的文件。您好haraldK。谢谢你的回答。执行此操作时,我的colorModel和光栅之间出现兼容性错误。@是的,我预料到了。这就是为什么我写了你可能需要调整createColorModel方法的原因。但是我不知道要做什么,没有看到你的输入文件。16位的256项调色板看起来可疑。你是真的。我不记得为什么我用了16位。我想我在放8的时候遇到了问题,但是现在8起作用了,所以没问题。TBH我找到了解决这个问题的方法。现在我正在努力以一种有效的方式将所有单色图层合并成一幅多色图像。目前,我正在使用Graphics.drawImage方法将所有层绘制到一个图像中,但大约15层需要500毫秒。有什么建议吗?PS:我如何向您发送图像?@red您可以附加问题中的文件(可能需要更多代表),或者只需在您的问题中提供一个链接,指向dropbox、google drive或类似文件共享服务中的文件。