【问题标题】:Making a Certain Color on a BufferedImage Become Transparent使 BufferedImage 上的某种颜色变得透明
【发布时间】:2011-11-16 09:12:58
【问题描述】:

已经回答了一个非常相似的问题:How to make a color transparent in a BufferedImage and save as PNG

不幸的是,我无法从那个来源为自己制定一个答案。

问:我在 Canvas 上绘制了一个 BufferedImage,并且只想创建一个方法,将每个像素变成某种颜色(在本例中:[214, 127, 255] / 0xD67FFF ) 变成透明的。 BufferedImage 是 ARGB 类型。

我不想将 BufferedImage 保存为文件,只需将其显示在我的画布上即可。

提前致谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    遍历所有像素并执行检查并使其透明。

    for (int y = 0; y < image.getHeight(); ++y) {
        for (int x = 0; x < image.getWidth(); ++x) {
             int argb = image.getRGB(x, y);
             if ((argb & 0x00FFFFFF) == 0x00D67FFF)
             {
                  image.setRGB(x, y, 0);
             }
        }
    }
    

    确保 BufferedImage 使用 alpha 通道,否则会变黑。
    请注意,这会影响您的原始图像。

    编辑:请注意,我更改了检查。因此它不会起作用,因为我假设您的像素是实心的(alpha = 255)。


    (0xFFD67FFF & 0x00FFFFFF) will result in 0x00D67FFF
    And, (0x00D67FFF == 0x00D67FFF)
    

    【讨论】:

    • 这不起作用。当我使用System.out.println(Integer.toHexString(argb)) 检查像素的颜色时,它返回 ffd67fff 而不是 00d67fff。 (我认为 alpha 值为 255 而不是 0。)我想我不太了解您的 if 条件。
    • 是的,确实如此。这就是我使用面具的原因(使用&amp;)。这样我只检查 RGB(不是 alpha)。 Alpha 在此无关紧要。你确定它不起作用吗?
    • 好吧,我已经尽力让它工作了,但无济于事。我确实通过以下方式修改if 条件使其工作:if (argb == 0xffD67FFF) image.setRGB(x, y, 0x00000000);。这似乎达到了预期的效果。谢谢。
    • 另外,(0xFFD67FFF &amp; 0x00FFFFFF) 的结果是 d67fff,而颜色是 ffd67fff。好像应该是(0xFFD67FFF &amp; 0xFFFFFFFF),虽然和(argb = 0xFFD67FFF)一样。
    • 但是:如您所知,蒙版会丢弃 Alpha 通道。而我正在做的是比较argb 没有alpha0xD67FFF
    【解决方案2】:

    对于完整的解决方案,如加载、处理和编写,您可以使用以下代码:

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class TransparentConverter {
    
        private static final Color backColor = Color.GREEN;
        private static final int THRESHOLD = 70;
        private static final int TRANSPARENT = 0;  // 0x00000000;
    
        static File base  = new File("C:\\images");
        static File base2 = new File("C:\\images2");
    
        public static void main(String[] args) throws IOException {
            System.out.println("TransparentConverter.main()");
    
            for (File file : base.listFiles()) {
                System.out.println(file);
                BufferedImage initImage = ImageIO.read(file);
                int width = initImage.getWidth(null),
                    height = initImage.getHeight(null);
    
                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
                Graphics g = image.getGraphics();
                g.drawImage(initImage, 0, 0, null);
    
                //System.out.println("before: " + image.getRGB(0, 0));
                for (int y = 0; y < height; y++) {
                    for (int x = 0; x < width; x++) {
                        int pixel = image.getRGB(x, y);
                        Color color = new Color(pixel);
    
                        int dr = Math.abs(color.getRed()   - backColor.getRed()),
                            dg = Math.abs(color.getGreen() - backColor.getGreen()),
                            db = Math.abs(color.getBlue()  - backColor.getBlue());
    
                        if (dr < THRESHOLD && dg < THRESHOLD && db < THRESHOLD) {
                            image.setRGB(x, y, TRANSPARENT);
                        }
                    }
                }
                //System.out.println("   after: " + image.getRGB(0, 0));
    
                file = new File(base2, file.getName());
                //System.out.println("   " + file);
                ImageIO.write(image, "png", file);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2010-10-12
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多