Я хочу напечатать растровое изображение на мобильном 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"?
- Полагаю, мне нужно было бы оценить информацию о цвете каждого пикселя и переключить ее на черный или белый (и я бы записал это значение в новый массив целевых байтов, который я в конечном итоге передал бы в принтер)?
- Как наилучшим образом оценить информацию о цвете каждого пикселя, чтобы определить, должен ли он быть черным или белым? (Рендеринг растрового изображения - черная боль на белом фоне)
Имеет ли этот подход смысл? Есть ли более простой способ? Недостаточно просто сделать растровое изображение черно-белым, основная проблема заключается в уменьшении информации о цвете для каждого пикселя в один бит.
UPDATE
По предложению Рувима я сначала преобразую растровое изображение в монохромное растровое изображение. и затем я буду перебирать каждый пиксель:
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;