我正在尝试分析位图中像素的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
来构建我自己的列数组?
答案 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。