从一张大图截取不透明部分
来源:互联网 发布: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
- 从一张大图截取不透明部分
- c# 从一个大图里截取图形
- c#从大图截取一部分图片
- c# 从一个大图里截取图形
- libgdx 从一张图上截取纹理
- 从View中截取一张图片
- j2se从大图上剪切一张小图
- 从一张大图里面获取各种小图标
- 截取一张图片中的部分区域存成新文件
- 截取一张图片中的部分区域存成新文件
- 从大图片中截取图片 BitmapData copyPixels Rectangle
- CSS从大图片上截取小图标的操作
- CSS从大图片上截取小图标的使用
- 从图片上截取一张小图片的实现
- 从一张图片截取JButton多种状态的Icon
- 交互产品设计,大图一张
- 【一张大图看懂人工智能】
- 从一图像中截取部分图像
- linux编程中显示文件名,函数名,行号
- win7-Wmvare 上安装 64 位linux
- JDBC操作
- addSubview和insertSubview 区别
- 家用制氧机怎样选择
- 从一张大图截取不透明部分
- Javascript 数组循环遍历之forEach
- 数据结构之线性表的顺序表示和实现
- 什么样的制氧机好用
- VS2010下生成dll的方法(更新)
- load average
- iOS开发~Instruments使用(二)
- NSFileHandle简单的读写文件
- adb shell input的用法