我想在java中剪切特定形状的图像,例如包含一个白色背景的人的图像,在这里我想裁剪没有背景的人。不想让它成为透明图像,想用一些坐标切割。我认为使用cropImageFilter 我们只能剪切矩形区域。谁能告诉我该怎么做?
问问题
2869 次
2 回答
0
首先,您需要从 java.awt.Image 创建一个 java.awt.image.BufferedImage。这里有一些代码可以做到这一点,来自DZone Snippets。
/**
* @author Anthony Eden
*/
public class BufferedImageBuilder {
private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;
public BufferedImage bufferImage(Image image) {
return bufferImage(image, DEFAULT_IMAGE_TYPE);
}
public BufferedImage bufferImage(Image image, int type) {
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, null, null);
waitForImage(bufferedImage);
return bufferedImage;
}
private void waitForImage(BufferedImage bufferedImage) {
final ImageLoadStatus imageLoadStatus = new ImageLoadStatus();
bufferedImage.getHeight(new ImageObserver() {
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
if (infoflags == ALLBITS) {
imageLoadStatus.heightDone = true;
return true;
}
return false;
}
});
bufferedImage.getWidth(new ImageObserver() {
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
if (infoflags == ALLBITS) {
imageLoadStatus.widthDone = true;
return true;
}
return false;
}
});
while (!imageLoadStatus.widthDone && !imageLoadStatus.heightDone) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
}
}
class ImageLoadStatus {
public boolean widthDone = false;
public boolean heightDone = false;
}
}
现在你有了一个 BufferedImage,你可以使用那个多边形的坐标,你必须把不是人的像素变成透明的。只需使用 BufferedImage 中提供的方法即可。
你不能从一个 BufferedImage 中切出一个多边形。BufferedImage 必须是矩形。您可以做的最好的事情是使您不想要透明的图像部分。或者,您可以将所需的像素放在另一个矩形 BufferedImage 上。
于 2010-06-23T08:42:30.150 回答
0
我不确定,但 Graphics2D 类有一个可以接受多边形的方法clip(),我认为它可以满足你的需要。
因此,从您的图像创建一个 BufferedImage,并使用以下命令获取 Graphics2D 对象createGraphics()
于 2010-06-23T09:52:19.663 回答