Я хочу распечатать растровое изображение на мобильный Bluetooth-принтер (Bixolon SPP-R200) - SDK не предлагает директивные методы для печати в памяти образ. Поэтому я подумал о преобразовании Bitmap следующим образом:Android: преобразование растрового изображения в монохромное растровое изображение (1 бит на пиксель)
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
To Monochrome Bitmap. Я рисую черный текст выше, указанный битмап, используя Canvas, который хорошо работает. Однако, когда я конвертирую вышеуказанный 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;
У меня есть этот QA снимался, потому что я работал на аналогичной концепции что касается программного манипулирования массивами, чтобы стать монохромными растровыми изображениями. У меня есть вопрос и его возможный ответ здесь: http://stackoverflow.com/questions/17918978/plot-an-array-into-bitmap-in-cc-for-thermal-printer Если это помогает людям, пожалуйста, напишите мне и Я придумаю подходящий ответ на этот вопрос. –
Почему вы используете GetPixels для загрузки всех пикселей в один массив ... Затем вложенный цикл через битмап AGAIN вызывает индивидуальные вызовы GetPixel (наименее эффективным способом)? Просто запустите свой исходный массив, а затем используйте SetPixels, чтобы вернуть весь массив в растровое изображение. –
@ClintStLaurent хорошая точка - код действительно старый xD - я даже не думаю, что мы используем его в этой форме больше, но, как вы указали правильно, это очень неэффективно, как там написано. Не стесняйтесь редактировать его в соответствии с вашим предложением. – AgentKnopf