创建图像的非透明部分的多边形

时间:2015-01-31 23:12:12

标签: java arrays image polygon

我想要实现的是获取image的模板,将其转换为尺寸为Array的{​​{1}},然后获取所有像素并查看它们是否具有alpha值(image.getWidth(), image.getHeight())

如果他们这样做,那么:

  • 为我目前正在审核的0坐标添加值1

ELSE:

  • 为我目前正在审核的x, y坐标添加值0

到目前为止,我知道如何编程。如果您有兴趣,这是我正在使用的代码:

x, y

我收到此面具后,我尝试使用此private int[] createMask(BufferedImage image) { final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); final int width = image.getWidth(); final int height = image.getHeight(); final boolean hasAlphaChannel = image.getAlphaRaster() != null; int[][] result = new int[height][width]; if (hasAlphaChannel) { for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += 4) { int alpha = pixels[pixel]; if(alpha != 0) { result[row][col] = 1; } else { result[row][col] = 0; } if (col == width) { col = 0; row++; } } } return result; } 通过此代码绘制Array,或者替换它(从http://docs.oracle.com/javase/tutorial/2d/geometry/arbitrary.html获得):

Polygon

但是,我需要创建一个方法,它给出 int x1Points[] = {0, 100, 0, 100}; int y1Points[] = {0, 50, 50, 0}; GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1Points.length); polygon.moveTo(x1Points[0], y1Points[0]); for (int index = 1; index < x1Points.length; index++) { polygon.lineTo(x1Points[index], y1Points[index]); }; polygon.closePath(); g2.draw(polygon); ArrayPoint对象中的所有坐标,围绕图像来创建一个&#34;掩码&#34 ;

    public Point[] getCords(int[] mask) {
        ArrayList<Point> points = new ArrayList<Point>(); //you can change this to whatever you want to use

        //get coords to surround the mask
        // >> involving `0` (for transparent) and `1` (non transparent) 
        //  >> these are contained in the `mask` Array...

        return points.toArray(new Points[0]);

所以,总结一下:

  • 我需要获取一个多边形,该多边形勾勒出int[]数组中图像的可见像素,其中包含值1&{39}和0&#39 ; s,前者用于非透明像素,后者用于透明像素。

1 个答案:

答案 0 :(得分:2)

(链接到下面的相关java代码)

要创建蒙版边框,请执行以下操作:对于每对坐标(x,y),检查其相邻点中的任何一个是否位于蒙版之外。但是,请记住,生成的蒙版不一定是1像素宽,矢量化它可能是非平凡的,如本例所示(白色是蒙版区域,红色是蒙版内的蒙版边框,黑色是未蒙展的)面积):

Mask border in red

幸运的是,即使你的面具中的某些地方有一个宽于1像素的边框,你也可以通过从该面具中拒绝掩模的一些像素来构建一个可多边形的子蒙版来解决这个问题。下图显示了子蒙版的蓝色边框:

Submask border in blue

我刚才实现了这样的算法。您可以使用代码,但它与我的解决方案紧密相关,但您可以在其中找到一些见解:Thick mask border resolution。它的想法是,从初始掩码开始,通过填充原始掩码来构建子掩码,其中谓词检查子掩码边界的单元格最多有2个基本方向邻居(顺序方向邻居不重要)这里)。

获得蓝色子蒙版的边框后,构建一个图形,其中顶点是子蒙版边界的点,边缘位于基本相邻点之间。然后遍历该图的每个组件,对于每个组件,您将获得构成多边形的点列表。