ventajas vectorial usos que modo mapa imagen grafico entre ejemplos diseño diferencia desventajas definicion corel android bitmap monochrome

android - vectorial - modo de mapa de bits



Android: conversión de un mapa de bits en un mapa de bits monocromático(1 bit por píxel) (4)

Quiero imprimir un mapa de bits en una impresora Bluetooth móvil (Bixolon SPP-R200): el SDK no ofrece métodos directos para imprimir una imagen en la memoria. Así que pensé en convertir un mapa de bits como este:

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

Para un mapa de bits monocromático. Estoy dibujando un texto negro en el mapa de bits dado utilizando un lienzo, que funciona bien. Sin embargo, cuando convierto el mapa de bits anterior en un ByteArray, parece que la impresora no puede manejar esos bytes. Sospecho que necesito una matriz con un bit por píxel (un píxel sería blanco = 1 o negro = 0).

Como parece que no hay una forma conveniente de hacerlo, una idea que tuve fue utilizar:

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

para obtener los píxeles. Supongo, tendría que usarlo de la siguiente manera:

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

Sin embargo, no estoy seguro de algunas cosas:

  • En getPixels, ¿tiene sentido simplemente pasar el ancho como el argumento "Stride"?
  • Supongo que tendría que evaluar la información de color de cada píxel y cambiarlo a negro o blanco (¿Y escribiría este valor en una nueva matriz de bytes objetivo que finalmente pasaría a la impresora)?
  • ¿Cómo evaluar mejor la información de color de cada píxel para decidir si debe ser negro o blanco? (El mapa de bits renderizado es un dolor negro sobre un fondo blanco)

¿Este enfoque tiene sentido en absoluto? hay una manera mas facil? No es suficiente hacer que el mapa de bits sea en blanco y negro, el problema principal es reducir la información de color para cada píxel en un bit.

ACTUALIZAR

Como lo sugirió Reuben, primero convertiré el mapa de bits en un mapa de bits monocromático. y luego iteraré sobre cada píxel:

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

Ahora Reuben sugirió "leer el byte más bajo de cada píxel de 32 bits", que estaría relacionado con mi pregunta sobre cómo evaluar el color del píxel. Mi última pregunta al respecto: ¿obtengo el byte más bajo simplemente haciendo esto?

// Using the pixel from bitmap.getPixel(x,y) int lowestByte = pixel & 0xff;


Puede convertir la imagen a monocromo 32bpp con ColorMatrix.

Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmpMonochrome); ColorMatrix ma = new ColorMatrix(); ma.setSaturation(0); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(ma)); canvas.drawBitmap(bmpSrc, 0, 0, paint);

Eso simplifica la conversión de color-> monocromo. Ahora puede hacer un getPixels () y leer el byte más bajo de cada píxel de 32 bits. Si es <128 es 0, de lo contrario es 1.


Bueno, creo que es bastante tarde ahora para responder a este hilo, pero a veces también estaba trabajando en esto y decidí construir mi propia biblioteca que convertirá cualquier imagen jpg o png en 1bpp .bmp. La mayoría de las impresoras que requieren imágenes de 1bpp admitirán esta imagen (probada en una de esas :)). Aquí puede encontrar la biblioteca, así como un proyecto de prueba que la utiliza para crear una imagen de canal único monocromo. Siéntete libre de cambiarlo ... :)

https://github.com/acdevs/1bpp-monochrome-android

Disfrutar..!! :)


La conversión a monocromo con exactamente el mismo tamaño que el mapa de bits original no es suficiente para imprimir.

Las impresoras solo pueden imprimir cada "píxel" (punto) como monocromo porque cada punto de tinta tiene solo 1 color, por lo que deben usar muchos más puntos que lo suficiente y ajustar su tamaño, densidad ... para emular la sensación de escala de grises. Esta técnica se llama semitonos . Puede ver que las impresoras a menudo tienen una resolución de al menos 600 ppp, normalmente de 1200-4800 ppp, mientras que la pantalla a menudo alcanza un máximo de 200 a 300 ppp.

Por lo tanto, su mapa de bits monocromo debe ser al menos 3 veces la resolución original en cada lado.


Debe convertir cada píxel en espacio HSV y usar el valor para determinar si el píxel en la imagen objetivo debe ser negro o blanco:

Bitmap bwBitmap = Bitmap.createBitmap( bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565 ); float[] hsv = new float[ 3 ]; for( int col = 0; col < bitmap.getWidth(); col++ ) { for( int row = 0; row < bitmap.getHeight(); row++ ) { Color.colorToHSV( bitmap.getPixel( col, row ), hsv ); if( hsv[ 2 ] > 0.5f ) { bwBitmap.setPixel( col, row, 0xffffffff ); } else { bwBitmap.setPixel( col, row, 0xff000000 ); } } } return bwBitmap;