java - 创建图像不透明部分的多边形

标签 java arrays image polygon

我想要实现的是获取图像的掩码,将其转换为尺寸为(image.getWidth(), image)的Array .getHeight()),然后获取所有像素并查看它们的 Alpha 值是否为 0

如果他们这样做,那么:

  • 为我当前正在检查的 x, y 坐标添加值 1

其他:

  • 为我当前正在检查的 x, y 坐标添加值 0

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

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通过此代码或其替代来绘制Polygon(从 http://docs.oracle.com/javase/tutorial/2d/geometry/arbitrary.html 获得) :

    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);

但是,我需要创建一个方法,为我提供由 Point 对象组成的 Array 中的所有坐标,以围绕图像创建一个“面具”。

    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]);
<小时/>

所以,总结一下:

  • 我需要从包含值 10int[] 数组中获取勾勒出图像可见像素轮廓的多边形> ,前者分别代表非透明像素,后者分别代表透明像素。

最佳答案

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

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

Mask border in red

幸运的是,即使蒙版中某些位置的边框宽于 1 像素,您也可以通过拒绝该蒙版中蒙版的某些像素来构建可多边形的子蒙版来解决此问题。下图以蓝色显示子掩码的边框:

Submask border in blue

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

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

关于java - 创建图像不透明部分的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28257605/

相关文章:

C++ 位列表作为数字

arrays - 尝试在数组函数上使用 async/await

java - 发送特定大小的数据时出现 BufferOverflowException

c# - 如何将 .dds 文件加载到图片框中?

JavaFX 中心图像不起作用

java - 使用cxf从wsdl生成java代码给出代码太大错误

java - 为什么 getText() 无法在 Struts 2 中格式化 double 值

java - 根据 Pepper 机器人收听的内容创建音频文件

java - 运行依赖于 WebSphere 中定义的资源的 JUnit 测试

html - CSS 显示调整大小和裁剪后的图像 - 续