我正在尝试在我的Android应用中将可变位图的一部分像素设置为不同的颜色。不幸的是,我无法正确使用setPixels()方法。我一直收到ArrayOutOfBoundsExceptions异常。我认为这可能与步幅有关,但我真的不确定。那是我仍然不理解的唯一参数。我看过的唯一其他关于setPixels(不是setPixel)的帖子在这里:drawBitmap() and setPixels(): what's the stride?它没有帮助我。我尝试将步幅设置为0、位图的宽度和位图的宽度减去我要绘制的区域,但它仍然崩溃。下面是我的代码:
public void updateBitmap(byte[] buf, int offset, int x, int y, int width, int height) {
// transform byte[] to int[]
IntBuffer intBuf = ByteBuffer.wrap(buf).asIntBuffer();
int[] intarray = new int[intBuf.remaining()];
intBuf.get(intarray);
int stride = ??????
screenBitmap.setPixels(intarray, offset, stride, x, y, width, height); // crash here
我的位图是可变的,所以我知道问题不在于它。我也确定我的字节数组已经被正确地转换为整数数组。但是我一直收到ArrayOutOfBoundsException异常,我不明白为什么。请帮我解决这个问题。
编辑 - 这是我构造虚假输入的方式:
int width = 1300;
int height = 700;
byte[] buf = new byte[width * height * 4 * 4]; // adding another * 4 here seems to work... why?
for (int i = 0; i < width * height * 4 * 4; i+=4) {
buf[i] = (byte)255;
buf[i + 1] = 3;
buf[i + 2] = (byte)255;
buf[i + 3] = 3;
}
//(byte[] buf, int offset, int x, int y, int width, int height) - for reference
siv.updateBitmap(buf, 0, 0, 0, width, height);
所以宽度和高度应该是正确的整数值(至少应该是这样)。编辑2 - 这是创建screenBitmap的原始代码:
public Bitmap createABitmap() {
int w = 1366;
int h = 766;
byte[] buf = new byte[h * w * 4];
for (int i = 0; i < h * w * 4;i+=4) {
buf[i] = (byte)255;
buf[i+1] = (byte)255;
buf[i+2] = 0;
buf[i+3] = 0;
}
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
IntBuffer intBuf = ByteBuffer.wrap(buf).asIntBuffer();
int[] intarray = new int[intBuf.remaining()];
intBuf.get(intarray);
Bitmap bmp = Bitmap.createBitmap(metrics, w, h, itmap.Config.valueOf("ARGB_8888"));
bmp.setPixels(intarray, 0, w, 0, 0, w, h);
return bmp;
}
在这种情况下似乎可以工作,不确定区别是什么。