【问题标题】:change color of transparent pixel in java在java中改变透明像素的颜色
【发布时间】:2014-01-15 11:20:52
【问题描述】:

现在我可以将另一个图像的像素应用于 pg 到 m 的源图像像素。但问题是我失去了渐变或褪色效果。

     public static void main(String[] args){
        try {
            BufferedImage image = ImageIO.read(new File("c:\\m.png"));
            BufferedImage patt = ImageIO.read(new File("c:\\pg.png"));

            int f = 0;
            int t = 0;
            int n = 0;
            BufferedImage bff = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
            for (int y = 0; y < image.getHeight(); ++y) {
                for (int x = 0; x < image.getWidth(); ++x) {
                    int argb = image.getRGB(x, y);
                    int nrg = patt.getRGB(x, y);

                    if(((argb>>24) & 0xff) == 0) {
                                bff.setRGB(x, y, (255<<24));
                    } else {
                                bff.setRGB(x, y, nrg);
                    }                               
                }
            }
            System.out.println("Trans : " + t + " Normal : " + n);
            File outputfile = new File("c://imagetest.png");
            ImageIO.write(bff, "png", outputfile);
        } catch (IOException ex) {

        }

}

谢谢。

【问题讨论】:

  • 不要改变颜色...改变透明度
  • 如何更改透明度

标签: java image-processing


【解决方案1】:

0xff000000 是不透明的黑色,0x00000000 是完全透明的。

0 是什么(你选择的颜色)?

是的,它是透明的。

试试0xff000000 或者更好:argb ^ 0xff000000,它只是改变了透明度。

                if(((argb>>24) & 0xff) == 0) {
                            bff.setRGB(x, y, argb ^ 0xff000000);
                } else {
                            bff.setRGB(x, y, argb);
                }                               

【讨论】:

    【解决方案2】:

    对于BufferedImage.setRGB(int x, int y, int rgb)rgb 的值组成如下:

    11111111 11111111 11111111 11111111 阿尔法红绿蓝

    在您的代码中,您测试以下内容:

    if (((argb >> 24) & 0xff) == 0)
    

    测试 Alpha 值为 0,因此完全透明。

    当你发现它为真时,然后你将 rgb 值设置为 0

    bff.setRGB(x, y, 0);
    

    所以你再次将其设置为透明。

    改成

    bff.setRGB(x, y, (255<<24));
    

    bff.setRGB(x, y, 0xff000000); //This should be better
    

    这会将其更改为不透明的黑色像素。这将有一个二进制值

    11111111000000000000000000000000

    编辑:Moritz Petersen's solution 应该会更好地工作,因为它在去除透明度的同时保留了像素的颜色。

    如果您想将其设置为特定颜色,您可以这样做:

    bff.setRGB(x, y, 0xffff0000); // red
    bff.setRGB(x, y, 0xff00ff00); // green
    bff.setRGB(x, y, 0xff0000ff); // blue
    

    或红色、绿色和蓝色值的任意组合。

    【讨论】:

    • 这真的很有帮助。
    • 如果我想将另一个图像的像素添加到这个不透明的图像中。
    • bff.setRGB(x, y, argb ^ 0xff000000);(来自 Moritz Petersen)将实现这一目标。您现在将其全部变为白色的原因是原始图像将像素设置为透明白色。
    • 我已经编辑了我的问题,现在当我将不同图像的像素应用于源图像时,我失去了褪色和渐变效果。
    • 当我使用 (nrg+argb) 添加两者的像素时,我在某个地方实现了我需要的,但只有黑色像素有问题,所有黑色像素现在都是白色的。
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2010-12-08
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多