我想在我的android應用程序中設置一個可變位圖中不同顏色的像素區域。不幸的是,我無法讓setPixels()正常工作。我不斷得到ArrayOutOfBoundsExceptions。我認爲這可能與邁步有點關係,但我真的不確定。這是我仍然不明白的唯一參數。我在setPixels(不是setPixel)上看到的唯一其他帖子在這裏:drawBitmap() and setPixels(): what's the stride?它並沒有幫助我。我嘗試將步幅設置爲0,作爲位圖的寬度,作爲位圖的寬度 - 我試圖繪製的區域,它仍然崩潰。這是我的代碼:Android的SetPixels()解釋和例子?
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;
}
似乎在這種情況下工作,不知道有什麼區別
步幅應爲寬度。這是1d數組中的數量,當它假裝爲2d數組時,您需要向下移動1。 – Tatarize
這不起作用,因爲setPixels()需要intarray。期。你的4色樣本字節數組變成了各種不同的藍色。 0baaaaaaaarrrrrrrrggggggggbbbbbbbbb – Tatarize