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