从位图获取单列像素?

时间:2014-03-11 01:05:21

标签: android bitmap

我正在尝试分析位图中像素的RGB值。我可以使用以下代码一次一行扫描位图...

private void analyseImage() {
    int w = imageBitmap.getWidth();
    int h = imageBitmap.getHeight();
    int[] pixels = new int[w];

    for (int vPos = 0; vPos < h; vPos++) {
        imageBitmap.getPixels(pixels, 0, w, 0, vPos, w, 1);
        for (int hPos = 0; hPos < w; hPos++) {
            if ((pixels[hPos] & 0x00FFFFFF) != 0x00FFFFFF) {
                Log.d(TAG, "analyseImage - found object pixel: " + pixels[hPos] + ", " + hPos + ", " + vPos);
        }
    }
}

完全正常工作,并确定具有除纯白色(我的背景颜色)之外的任何其他颜色的像素。

理想情况下,我想做的是每次都获取一列像素而不是一行,但我认为我误解了stride的{​​{1}}参数和以下getPixels(...)循环抛出for

ArrayIndexOutOfBoundsException

正如我所说,我显然误解了int[] pixels = new int[h]; for (int hPos = 0; hPos < w; hPos++) { imageBitmap.getPixels(pixels, 0, w, hPos, 0, 1, h); for (int vPos = 0; vPos < h; vPos++) { if ((pixels[vPos] & 0x00FFFFFF) != 0x00FFFFFF) { Log.d(TAG, "analyseImage - found object pixel: " + pixels[hPos] + ", " + hPos + ", " + vPos); } } } 的工作方式,但我认为我可以使用上述方法一次阅读一列。有没有一种简单的方法一次读取一个列,或者我必须手动执行它,重复调用stride来构建我自己的列数组?

1 个答案:

答案 0 :(得分:2)

你确实误解了步幅,stride是RETURNED整数数组的跳过参数。你想要的是stride为1,因为你希望在返回的值数组中基本上没有跳过。您将超过新分配的数组的末尾,因为您正在使用原始图像宽度的步幅。从下移动到下面,告诉我结果。

自:

imageBitmap.getPixels(pixels, 0, w, hPos, 0, 1, h);

要:

imageBitmap.getPixels(pixels, 0, 1, hPos, 0, 1, h);

从此函数定义的例外部分:

<强>抛出: * IllegalArgumentException *如果x,y,width,height超出位图的边界,或者如果abs(stride)&lt;宽度。

在您的情况下,宽度实际上只有1。