15

我正在尝试在 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,width、height 为位图的宽高。

位图的 getPixels() 是否不是为我的使用目的而设计的(获取位图子区域的一大块像素信息)?还是我使用不当?有没有另一种方法可以做到这一点,也许使用不同的类?

如果有人对此有话要说,我将不胜感激。谢谢。

4

3 回答 3

12

getPixels() 返回源位图的完整 int[] 数组,因此必须使用与源位图的高度 x 宽度相同的长度进行初始化。

像这样使用,bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);实际上确实从位图中获取所需的像素,并用 0 填充数组的其余部分。因此,对于 100 x 10 的位图的 10 x 10 子集,从 0,0 开始,前 100 个值将是所需的 int 值,其余为 0。

您总是可以尝试使用Bitmap.createBitmap()来创建您的子集位图,然后getPixels()在您的新位图上使用来获取完整的数组。

于 2012-11-19T03:18:59.273 回答
7

大多数人都想使用 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;
}
}
于 2015-11-13T09:23:10.637 回答
0

我怀疑问题是您将“步幅”指定为bitmap.getWidth().

这意味着在像素数组的每一行中保留的空间将是该宽度,而不仅仅是 10。在这种情况下,您应该将像素数组分配为[bitmap.getWidth() * 10]很大,而不仅仅是[10 * 10].

或者,您可能首先想做的只是指定步幅为 10:

bitmap.getPixels(pixels, 0, 10, x, y, 10, 10);
于 2020-03-20T18:58:54.903 回答