[英]How to remove white background of an image - java
我想删除图像的白色背景并将其另存为另一张图像。 我写了一个提取背景的代码,但它留下了一些像素值。 结帐原始图像:
它仍然留下一些白色背景。
我也想删除它。
这是我的代码:
int x1=0;
int y1=0;
boolean res = false;
System.out.println("in formatImage");
//宽度去除...
for (int x = 0; x <= w-1; x++) {
for (int y = 0; y <= h-1; y++) {
if(new Color(bi1.getRGB(x, y)).getRGB()==-1)
{res=false;}
else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) {
res = true;
}
if (res) {
for (int p = y; p <= h-1; p++) {
b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB());
}
x1++;
res = false;
break;
}
}
}
b21=new BufferedImage(x1,h,BufferedImage.TYPE_INT_RGB);
x1=0;
for (int x = 0; x <= w-1; x++) {
for (int y = 0; y <= h-1; y++) {
if(new Color(bi1.getRGB(x, y)).getRGB()==-1)
{res=false;}
else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) {
res = true;
}
if (res) {
for (int p = 0; p <= h-1; p++) {
b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB());
}
x1++;
res = false;
break;
}
}
}
//高度去除
for (int y = 0; y <= h-1; y++) {
System.out.println("Y = "+y);
for (int x = 0; x <= x1-1; x++) {
System.out.println("("+x+","+y+") : "+b21.getRGB(x, y));
if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
res = true;
}
if (res) {
for (int p = 0; p <= x1-1; p++) {
b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());
}
y1++;
res = false;
break;
}
}
}
b31=new BufferedImage(x1,y1,BufferedImage.TYPE_INT_RGB);
int ty=y1;
y1=0;
for (int y = 0; y <= h-1; y++) {
for (int x = 0; x <= x1-1; x++) {
if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
res = true;
}
if (res) {
for (int p = 0; p <= x1-1; p++) {
b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());
}
y1++;
res = false;
break;
}
}
}
b31 有最终图像。
正如吉姆所说,身体附近的颜色不是纯白色。 因此,您修改了代码的以下语句,它将对您很有用。 替换以下命令行
if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE))
经过
if (new Color(b21.getRGB(x, y)).getRGB()<-1000000)
这会给你你想要的输出。 您可以将白色和灰色的深浅从 -1000000 更改为 -2000000
我确实创建了一个将白色背景转换为透明的函数
public Image makeWhiteBGToTransparent(final BufferedImage im) {
final ImageFilter filter = new RGBImageFilter() {
public int markerRGB = 0xFFFFFFFF;
public final int filterRGB(final int x, final int y, final int rgb) {
if ((rgb | 0xFF000000) == markerRGB) {
return 0x00FFFFFF & rgb;
} else {
return rgb;
}
}
};
final ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
现在,如果我们想将此Image
转换为BufferedImage
则使用此函数
public BufferedImage toBufferedImage(Image img) {
if (img instanceof BufferedImage) {
return (BufferedImage) img;
}
BufferedImage bImage = new BufferedImage(img.getWidth(null), img.getHeight(null),
BufferedImage.TYPE_INT_ARGB);
Graphics2D bGr = bImage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
return bImage;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.