如何解决java-如何在BufferedImage中找到对象的范围
所以我试图在png图像中找到对象的上,下,左和右范围。图像的背景为透明,中间为黑色圆圈。如何找到圆的上,下,左和右范围(全黑),从而使圆与透明背景隔离?
到目前为止我尝试过的事情:
public static BufferedImage trimImage(BufferedImage image) {
int left = 0,right = 0,up = 0,down = 0;
for(int i = 0; i<image.getHeight(); i++) {
for(int j = 0; j<image.getWidth(); j++) {
if(image.getRGB(j,i)==0) {
up = i;
break;
}
}
}
for(int i = 0; i<image.getWidth(); i++) {
for(int j = 0; j<image.getHeight(); j++) {
if(image.getRGB(i,j)==0) {
left = i;
break;
}
}
}
for(int i = 0; i<image.getHeight(); i++) {
for(int j = 0; j<image.getWidth(); j++) {
if(image.getRGB(j,i)==0&&i>down) {
down = i;
}
}
}
for(int i = 0; i<image.getWidth(); i++) {
for(int j = 0; j<image.getHeight(); j++) {
if(image.getRGB(i,j)==0&&i>down) {
right = i;
}
}
}
System.out.println(up+","+down+","+left+","+right);
BufferedImage temp = image.getSubimage(left,up,right-left,down-up);
return temp;
}
您知道更简单的方法吗?这给了我以下错误:
Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside raster
感谢您的帮助。谢谢!
编辑:这是完整的stackTrace():
Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside raster
at sun.awt.image.IntegerInterleavedRaster.createWritableChild(Unknown Source)
at java.awt.image.BufferedImage.getSubimage(Unknown Source)
at main.ImageHandler.trimLetter(ImageHandler.java:114)
at main.HandwritingReader.<init>(HandwritingReader.java:48)
at main.HandwritingReader.main(HandwritingReader.java:55)
解决方法
考虑到左边是最低的x坐标,顶部是最低的y坐标,右边是最高的x坐标,而底部是最高的y坐标。
int left = Integer.MAX_VALUE;
int right = 0;
int top = Integer.MAX_VALUE;
int bottom = 0;
for(int i = 0; i<image.getWidth(); i++) {
for(int j = 0; j<image.getHeight(); j++) {
if(image.getRGB(i,j)==0) {
left = Math.min(left,i);
right = Math.max(right,i);
top = Math.min(top,j);
bottom = Math.max(bottom,j);
}
}
}
这应该在循环完成时为您提供界限。
我制作了一个示例图像并进行了尝试。
BufferedImage image = new BufferedImage(256,256,BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
g.setColor(Color.BLACK);
g.fillOval(25,25,32,32);
g.dispose();
在这种情况下,我必须检查image.getRGB() != 0
是否是因为透明像素为0,但黑色像素具有255 alpha值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。