簡體   English   中英

創建圖像的非透明部分的多邊形

[英]Create polygon of non-transparent parts of image

我想要實現的是獲取image的蒙版,將其轉換為具有尺寸(image.getWidth(), image.getHeight())Array ,然后獲取所有像素並查看它們的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像素寬,對其進行矢量化可能並不平凡,如本例所示(白色是蒙版區域,紅色是蒙版內部的蒙版邊框,黑色是未蒙版區域) :

蒙版邊框為紅色

幸運的是,即使您在蒙版中的某些位置獲得了大於1像素的邊框,也可以通過拒絕該蒙版中的蒙版某些像素來構建可多邊形化的子蒙版來解決該問題。 下圖以藍色顯示了子蒙版的邊框:

子遮罩邊框為藍色

我前一段時間實現了這樣的算法。 有可以使用的代碼,但是它與我的解決方案緊密結合,但是您可以從中找到一些見解: 厚掩模邊框分辨率 它的想法是,從初始蒙版開始,通過用謂詞填充原始蒙版來構建子蒙版,該謂詞檢查子蒙版邊界的一個單元格最多具有2個基本方向的鄰居(此處的常規方向的鄰居無關緊要)。

一旦獲得了藍色子蒙版的邊界,就建立一個圖形,其中頂點是子蒙版邊界的點,並且邊緣在基數上相鄰的點之間。 然后遍歷該圖的每個組件,對於每個組件,您將獲得形成多邊形的點的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM