java中的图像裁剪
我想在java中剪切一个特定形状的图像,例如一个包含有白色背景的人的图像,这里我想裁剪没有背景的人。不想让它成为透明的图像,想用一些坐标剪切。我认为使用cropImageFilter我们只能切割矩形区域。有人能告诉我怎么做吗 首先,需要从java.awt.image创建java.awt.image.buffereImage。这里有一些代码可以做到这一点,从 现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法java中的图像裁剪,java,image,crop,Java,Image,Crop,我想在java中剪切一个特定形状的图像,例如一个包含有白色背景的人的图像,这里我想裁剪没有背景的人。不想让它成为透明的图像,想用一些坐标剪切。我认为使用cropImageFilter我们只能切割矩形区域。有人能告诉我怎么做吗 首先,需要从java.awt.image创建java.awt.image.buffereImage。这里有一些代码可以做到这一点,从 现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法
你不能直接从BuffereImage中剪切多边形。BuffereImage必须是矩形。你能做的最好的事情就是把你不想要的部分变成透明的。或者,您可以将所需的像素放在另一个矩形BuffereImage上。首先,您需要从java.awt.image创建一个java.awt.image.buffereImage。这里有一些代码可以做到这一点,从 现在你有了一个BuffereImage,你可以使用坐标的多边形,你必须把不是人的像素变成透明的。只需使用BuffereImage中提供的方法
你不能直接从BuffereImage中剪切多边形。BuffereImage必须是矩形。你能做的最好的事情就是把你不想要的部分变成透明的。或者,您可以将所需的像素放在另一个矩形缓冲区图像上。我不确定,但Graphics2D类有一种方法可以接受多边形,我认为它可以满足您的需要
因此,从您的图像创建一个BuffereImage,并使用
createGraphics()
获取Graphics2D对象,我不确定,但Graphics2D类有一种方法可以接受多边形,我想它可以满足您的需要
因此,从图像中创建一个BuffereImage,并使用
createGraphics()
获取Graphics2D对象。那么,您想根据人的形状准确地切割人吗?你意识到这不是一件小事吗?计算机很难识别图像中的东西。在标准Java库中当然没有简单的API来实现这一点。嗨,Jesper,谢谢你的回复,我有坐标,也就是说,我有多边形点(坐标)来切割人的形状。有了这个我们能做些什么吗?那么,你想根据男人的形状准确地切割男人吗?你意识到这不是一件小事吗?计算机很难识别图像中的东西。在标准Java库中当然没有简单的API来实现这一点。嗨,Jesper,谢谢你的回复,我有坐标,也就是说,我有多边形点(坐标)来切割人的形状。有了这个我们能做什么吗?
/**
* @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;
}
}