Android SetPixels () Объяснение и пример?

1

Я пытаюсь установить область пикселей в изменяемом растровом изображении другого цвета в моем приложении для Android. К сожалению, я не могу заставить setPixels() работать правильно. Я постоянно получаю ArrayOutOfBoundsExceptions. Я думаю, что это может иметь какое-то отношение к шагу, но я действительно не уверен. Это единственный параметр, который я до сих пор не понимаю. Единственное другое сообщение, которое я видел на setPixels (not setPixel), находится здесь: drawBitmap() и setPixels(): что за шаг? и это не помогло мне. Я попытался установить шаг как 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);

Таким образом, ширина и высота - это правильное количество int (по крайней мере, должно быть).

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

Кажется, что работает в этом случае, не уверен, в чем разница

Теги:
bitmap

2 ответа

2

возможно, это должно быть:

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

потому что вы преобразовали байт в int. ваша ошибка: ArrayOutOfBoundsExceptions. проверьте размер intBuf.remaining() = width * height / 4.

  • 0
    Мой размер массива правильный, я думаю. Если я создаю ложный ввод 1300 x 700 байтов (то есть 1300 x 700 x 4 байта = 3640 000), это создает внутреннюю матрицу длиной 91 000, что составляет одну четвертую от общего числа. В формате ARGB_8888 каждый пиксель имеет одно 32-битное целое, то есть 91 000 = 1300 x 700, так что должно быть достаточно данных о пикселях, чтобы заполнить 1300x700 секцию растрового изображения. Однако, когда я делаю 1300 x 700 x 4 x 4 пикселя, он заполняет нужное количество места без сбоев. Моя математика как-то не так? -EDIT: см. Выше, как я создаю фальшивый ввод
  • 0
    в какой строке ваш код потерпел крах в? intBuf.remaining () или screenBitmap.setPixels? и какова ваша ценность шага? это не может быть отображено
Показать ещё 6 комментариев
0

Если вы пытаетесь использовать растровое изображение, лучшим вариантом будет отказ от этого метода и использование вместо него холста:

Canvas canvas = new Canvas(screenBitmap);

Затем вы можете нарисовать определенные точки (если вы хотите нарисовать пиксель) или другие фигуры, такие как прямоугольники, круги и т.д.:

canvas.drawPoint(x, y, paint);

и т.д.

Надеюсь, что это поможет.

  • 0
    Ну, я не пытаюсь рисовать на растровом изображении. Я пытаюсь смоделировать подачу видео в реальном времени, поэтому я буду обновлять растровое изображение новыми данными изображения по мере его поступления. Поэтому я не хочу рисовать, я хочу установить для пикселей новое значение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню