从一张大图截取不透明部分

来源:互联网 发布:cc网络验证模块源码 编辑:程序博客网 时间:2024/04/25 08:02

假如有一张大图,其中有一部分不透明的,现在仅限于讨论矩形的情况:即大图是矩形,不透明的部分也是矩形



我们不可能遍历它的二维数组:1024*900,遍历次数等于921600,我想到的一个办法是每几个点采一次样,例如以10*10为一个单位去判断该点是否透明,这样我们最多只需要遍历102*90 = 9180次,这样,采样越大,遍历的次数越小。是具体情况而定。如下图,我们可以确定不透明的部分在第二行的第一列,我们只需遍历该区域的10*10个点就可以确定不透明部分的起始点,再在水平方向和垂直方向去遍历便可得到不透明部分的宽高,最多遍历900+1024遍



上代码:

/** * 从一张很大的位图截取不透明的部分 * @param bitmap 大图 * @param sampleSize 取样的点数 * @return */    private int[] clipBitmap(Bitmap bitmap,int sampleSize){    int maxX = 0,maxY = 0,minX = 0,minY = 0;    int[] coordinates = new int[4];//分别为minX,minY,maxX,maxY    final int width = bitmap.getWidth();    final int height = bitmap.getHeight();    int[]pixels = new int [width * height];    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);    for(int row = 0;row < height;row += sampleSize){    for(int column = 0;column < width;column += sampleSize){    int PixValue = pixels[width * row + column];    if(PixValue != 0){    int beginI = row - sampleSize;    int beginJ = column - sampleSize;    if(beginI < 0){    beginI = 0;    }    if(beginJ < 0){    beginJ = 0;    }    for(int i = beginI;i <= beginI + sampleSize  && i < height;i++){    for(int j = beginJ;j <= beginJ + sampleSize  && j < width;j++){    PixValue = pixels[width * i + j];     if(PixValue != 0){//找到起始点(x,y)    minX = j;minY = i;    coordinates[0] = j;    coordinates[1] = i;    for(int r = i;r < height;r++){//特定列的遍历    PixValue = pixels[r * width + j];    if(PixValue != 0){    maxY = r -1;    coordinates[3] = maxY;    }    }    if(coordinates[3] == 0){    coordinates[3] = height-1;    }int value = i *width;    for(int l = j;l < width;l++){//特定行的遍历    PixValue = pixels[value + l];    if(PixValue != 0){    maxX = l - 1;    coordinates[2] = maxX;    }    }    if(coordinates[2] == 0){    maxX = width-1;        coordinates[2] = maxX;    }        return coordinates;    }    }    }    }    }    }    return coordinates;    }


0 0
原创粉丝点击