我正在尝试在Android中进行一些图像处理。 我需要获取位图的一大块像素信息。 所以我尝试使用其中一个Bitmap类方法getPixels()。 但是,似乎我没有正确使用它,或者我误解了方法行为的唯一目的。
例如,我正在执行以下操作,以便从任意位置(位图坐标)x,y获取位图的10 x 10区域的像素信息。
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
int[] pixels = new int[100];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 10, 10);
我得到了ArrayIndexOutOfBoundsException。 我一直在谷歌上看看我做错了什么,但我一无所知。 关于使用getPixels()的大多数示例或问题通常用于提取整个图像的像素信息的情况。因此int数组的大小通常是bitmap.getWidth()* bitmap.getHeight(),x和y值是0,0,宽度,高度是位图的宽度和高度。
Bitmap的getPixels()是不是出于我的目的而设计的(获取位图子区域的一块像素信息)?还是我错误地使用它?有没有其他方法可以做到这一点,也许使用不同的类?
如果有人对此有所说法,我将不胜感激。感谢。
答案 0 :(得分:6)
getPixels()返回源位图的完整int []数组,因此必须使用与源位图的高度x宽度相同的长度进行初始化。
使用如此,bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);
实际上从位图中获取所需的像素,并用0填充数组的其余部分。因此,使用10 x 10位图的100 x 10,从0开始,0前100个值是所需的int值,其余值为0。
您可以尝试使用Bitmap.createBitmap()
创建子集位图,然后在新位图上使用getPixels()
来获取整个数组。
答案 1 :(得分:4)
大多数人都希望使用getPixels()获取特定区域像素,但实际上它返回了原始位图的完整大小。有效区域位于左角,其他区域为半透明颜色。我建议您使用Android Studio调试模式通过创建位图来查看可视像素。
以下是我的getPixels()版本,以获取特定的区域像素:
public class BitmapHelper {
public static int[] getBitmapPixels(Bitmap bitmap, int x, int y, int width, int height) {
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y,
width, height);
final int[] subsetPixels = new int[width * height];
for (int row = 0; row < height; row++) {
System.arraycopy(pixels, (row * bitmap.getWidth()),
subsetPixels, row * width, width);
}
return subsetPixels;
}
}
答案 2 :(得分:0)
我怀疑问题是您将“跨度”指定为bitmap.getWidth()
。
这意味着在像素阵列的每一行中保留的空间将是该宽度,而不仅仅是10。在这种情况下,您应该将像素阵列分配为[bitmap.getWidth() * 10]
大,而不仅仅是{{1} }。
或者,也许您最想做的只是将步幅指定为10:
[10 * 10]