我试图在我的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


我的位图是可变的,所以我知道这不是问题。我还可以确定我的字节数组已正确转换为整数数组。但是我一直在获取ArrayOutOfBoundsExceptions并且我不明白为什么。请帮我弄清楚

编辑-
这是我构造假输入的方法:

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);


因此,宽度和高度是正确的整数(至少应该是整数)。

EDIT2-这是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;
}


在这种情况下似乎可以正常工作,不确定有什么区别

最佳答案

可能应该是:

screenBitmap.setPixels(intarray, 0, width / 4, x, y, width / 4, height);


因为您已将字节转换为int。您的错误是ArrayOutOfBoundsExceptions。检查大小是否intBuf.remaining() = width * height / 4

关于android - Android SetPixels()的解释和示例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19019825/

10-09 06:57