Android быстрое растровое рисование - PullRequest
0 голосов
/ 05 ноября 2019

Мне нужно оптимизировать эту часть кода, которая потребляет около 70 мс (на моем Samsung Galaxy Tab S2 - Android 7.0):

private static final int IR_FRAME_WIDTH = 160;
private static final int IR_FRAME_HEIGHT = 120;

...

final int[] bmp_data = NormalizeBmp(image_data, IR_FRAME_WIDTH, IR_FRAME_HEIGHT, Polarity.WhiteHot);

Bitmap bitmap = Bitmap.createBitmap(IR_FRAME_WIDTH, IR_FRAME_HEIGHT, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(bitmap, 0, 0, null);

final Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);

for (int y = 0; y < IR_FRAME_HEIGHT; y++)
    for(int x = 0; x < IR_FRAME_WIDTH; x++) {
        final int _gray = bmp_data[(y * IR_FRAME_WIDTH) + x];

        paint.setColor(Color.rgb(_gray, _gray, _gray));
        canvas.drawPoint(x, y, paint);
    }

Я не привык к нативному коду, поэтому я бы предпочел не-использовать его, если есть стандартный кодовый способ улучшить эту производительность. Я думаю, что код довольно понятен NormalizeBmp создать массив из 160x120 целых чисел, содержащий серый тон для использования. Я могу легко изменить NormalizeBmp для получения другого цвета.

1 Ответ

1 голос
/ 05 ноября 2019

Вместо того, чтобы рисовать попиксельно поверх холста, вы можете создать растровое изображение непосредственно из данных, возвращаемых NormalizeBmp (). Все, что вам нужно, это изменить возвращенный массив int, чтобы упаковать цвета в формате RGB. Так как вы используете тот же цвет, чтобы установить Paint () в RGB, это будет довольно просто. Вот простой способ упаковать цвет:

retVal[i] = (0xFF << 24) | (retVal[i] & 0xFF)<< 16 | (retVal[i] & 0xFF) << 8 | retVal[i]

и затем использовать измененный массив для рисования растрового изображения, используя Bitmap.Create (int [] colors, width, height, bitmap_format).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...