Java 使BuffereImage上的特定颜色变为透明

Java 使BuffereImage上的特定颜色变为透明,java,Java,已经回答了一个非常类似的问题: 不幸的是,我无法从那个来源为自己制定一个答案 问:我在画布上绘制了一个BuffereImage,只想创建一个方法,将具有特定颜色的每个像素(在本例中为[214127255]/0xD67FFF)转换为透明像素。BuffereImage的类型为ARGB 我不想将BuffereImage保存为文件,只需将其显示在画布上即可 提前感谢。迭代所有像素,执行检查并使其透明 for (int y = 0; y < image.getHeight(); ++y) {

已经回答了一个非常类似的问题:

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

问:我在画布上绘制了一个BuffereImage,只想创建一个方法,将具有特定颜色的每个像素(在本例中为[214127255]/0xD67FFF)转换为透明像素。BuffereImage的类型为ARGB

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


提前感谢。

迭代所有像素,执行检查并使其透明

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);
         }
    }
}

迭代所有像素,执行检查并使其透明

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);
         }
    }
}

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

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);
        }
    }
}

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

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);
        }
    }
}

这不管用。当我使用System.out.PRINTLNIGER.toHexStringargb检查像素的颜色时,它返回ffd67fff而不是00d67fff。阿尔法值是255,我想不是0。我想我不太了解你的if状况。是的,的确如此。这就是为什么我使用&。这样我只检查RGB而不是alpha。阿尔法在这种情况下并不重要。你确定它不起作用吗?嗯,我已经尽力让它起作用了,但没有用。通过以下方式修改if条件,我确实做到了这一点:if argb==0xffD67FFF image.setRGBx,y,0x00000000;。这似乎达到了预期的效果。谢谢。另外,0xFFD67FFF&0x00FFFFFF将生成d67fff,而颜色为ffd67fff。看起来它应该是0xFFD67FFF&0xFFFFFFFF,尽管它与argb=0xFFD67FFF相同。但是:正如您所知,掩码将分解alpha通道。我要做的是比较不带alpha的argb和0xd67fff这不起作用。当我使用System.out.PRINTLNIGER.toHexStringargb检查像素的颜色时,它返回ffd67fff而不是00d67fff。阿尔法值是255,我想不是0。我想我不太了解你的if状况。是的,的确如此。这就是为什么我使用&。这样我只检查RGB而不是alpha。阿尔法在这种情况下并不重要。你确定它不起作用吗?嗯,我已经尽力让它起作用了,但没有用。通过以下方式修改if条件,我确实做到了这一点:if argb==0xffD67FFF image.setRGBx,y,0x00000000;。这似乎达到了预期的效果。谢谢。另外,0xFFD67FFF&0x00FFFFFF将生成d67fff,而颜色为ffd67fff。看起来它应该是0xFFD67FFF&0xFFFFFFFF,尽管它与argb=0xFFD67FFF相同。但是:正如您所知,掩码将分解alpha通道。我要做的是比较没有alpha的argb和0xD67FFF