java - 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,而黑色像素的 alpha 值为 255。
推荐阅读
- android - firebase OTP 未收到国际号码
- java - 如何将 Java 流转换为 Scala 数组?
- powershell - PowerShell猜谜游戏最大猜数
- c# - Webapi 和普通方法在同一个控制器中?
- android - 当我将格式设置为 YUV 时如何使用 Camera2 API 获取 exif
- sql-server - SQL - 在 LIKE 查询中包含空格以过滤内容,包括脏话
- java - Java - 一种在解析 JSON 时忽略无效记录的更好方法
- ruby-on-rails - 从 StripeAccountsController 中的表单将参数保存在我的 UsersController(设计)中?
- java - 在 Java 7 中的间谍中对 @Asynchronous 方法进行单元测试
- python - 如何使用带有 cx_freeze 的 python 脚本创建 exe 文件?