Android: преобразование растрового изображения в монохромное растровое изображение (1 бит на пиксель)

Я хочу напечатать Bitmap на мобильном принтере Bluetooth (Bixolon SPP-R200) ​​- SDK не предлагает прямые методы для печати изображения в памяти . Итак, я подумал о преобразовании растрового изображения следующим образом:

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

в монохромное растровое изображение. Я рисую черный текст на данном растровом изображении, используя холст, который хорошо работает. Однако, когда я конвертирую приведенный выше Bitmap в ByteArray, кажется, что принтер не может обрабатывать эти байты.Я подозреваю, что мне нужен массив с одним битом на пиксель (пиксель будет либо белым = 1, либо черным = 0).

Поскольку кажется, что нет удобного, нестандартного способа сделать это, у меня была одна идея:

bitmap.getPixels(pixels, offset, stride, x, y, width, height)

получить пиксели. Я предполагаю, что мне пришлось бы использовать его следующим образом:

int width = bitmap.getWidth();
int height = bitmap.getHeight();

int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

Однако - я не уверен в некоторых вещах:

  • В getPixels - имеет ли смысл просто передавать ширину в качестве аргумента "Stride"?
  • Думаю, мне придется оценить информацию о цвете каждого пикселя и либо переключить его на черный, либо на белый (и я бы записал это значение в новый целевой массив байтов, который в конечном итоге передал бы на принтер)?
  • Как лучше всего оценить информацию о цвете каждого пикселя, чтобы решить, что он должен быть черным или белым? (Визуализированное растровое изображение - это черная боль на белом фоне)

Имеет ли вообще смысл этот подход? Есть способ попроще? Недостаточно просто сделать растровое изображение черно-белым, основная проблема - уменьшить информацию о цвете для каждого пикселя до одного бит.

ОБНОВЛЕНИЕ

Как предложил Рубен, я сначала конвертирую растровое изображение в монохромное растровое изображение. а затем я буду перебирать каждый пиксель:

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    // Iterate over height
    for (int y = 0; y < height; y++) {
        int offset = y * height;
        // Iterate over width
        for (int x = 0; x < width; x++) {
            int pixel = bitmap.getPixel(x, y);
        }
    }

Теперь Рубен предложил «прочитать самый младший байт каждого 32-битного пикселя» - это связано с моим вопросом о том, как оценивать цвет пикселя. Мой последний вопрос по этому поводу: получаю ли я самый младший байт просто так:

// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
21
задан AgentKnopf 21 February 2012 в 13:11
поделиться