java中的图像裁剪
Posted
技术标签:
【中文标题】java中的图像裁剪【英文标题】:Image cropping in java 【发布时间】:2010-06-23 06:53:20 【问题描述】:我想在java中剪切特定形状的图像,例如包含一个白色背景的人的图像,这里我想裁剪没有背景的人。不想让它成为透明图像,想用一些坐标切割。我认为使用cropImageFilter 我们只能剪切矩形区域。谁能告诉我该怎么做?
【问题讨论】:
那么,你想根据男人的形状准确地剪出男人吗?您是否意识到这不是一项微不足道的任务?计算机很难识别图像中的事物。标准 Java 库中肯定没有简单的 API 来实现这一点。 嗨 Jesper,感谢您的回复,我已经与我协调,即我有多边形点(坐标)来切割人的形状。有了这个我们可以做些什么吗? 【参考方案1】:首先,您需要从 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 上。
【讨论】:
【参考方案2】:我不确定,但 Graphics2D 类有一个方法 clip(),它接受一个多边形,我认为可以满足你的需要。
因此,从您的图像创建一个 BufferedImage,并使用 createGraphics()
获取 Graphics2D 对象
【讨论】:
以上是关于java中的图像裁剪的主要内容,如果未能解决你的问题,请参考以下文章