Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Convertir un mapa de bits en un mapa de bits monocromo (1 bit por pixel)

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

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

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

  • Cómo guardar el estado de la actividad de Android mediante Guardar estado de la instancia
  • ¿La publicación de Runnable a un hilo de interfaz de usuario garantiza que el diseño esté terminado cuando se ejecuta?
  • BroadcastReceiver onReceive () se llama dos veces
  • Prompt Android App User para actualizar la aplicación si la versión actual <> versión del mercado
  • ¿Cómo utilizar ExecutorService con Android AsyncTask?
  • Cómo publicar una actualización de la aplicación en el mercado androide?
  • Como no parece ser conveniente, fuera de la forma de caja para hacer eso, una idea que tenía era utilizar:

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

    Para obtener los píxeles. Supongo que 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 acerca 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 de destino que finalmente pasaría a la impresora)?
    • ¿Cómo evaluar mejor cada información de color de píxeles para decidir que debe ser negro o blanco? (El bitmap prestado es el dolor negro sobre un fondo blanco)

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

    ACTUALIZAR

    Como sugerido por Reuben primero convertiré el mapa de bits a 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 se relacionaría con mi pregunta sobre cómo evaluar el color del píxel. Mi última pregunta en este sentido: ¿Consigo el byte más bajo simplemente haciendo esto:

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

  • ¿Cómo termino HandlerThreads?
  • No se puede actualizar Eclipse ADT a 22
  • ¿Cómo puedo crear una suite de pruebas de Android que sólo ejecuta pruebas especificadas en una o más clases?
  • Pantalla en negro antes de que la pantalla Splash aparezca en android
  • Publicar versión beta en el mercado de Android
  • ¿Es necesario el nombre de la actividad en AndroidManifest.xml para comenzar con un punto?
  • 4 Solutions collect form web for “Android: Convertir un mapa de bits en un mapa de bits monocromo (1 bit por pixel)”

    Puede convertir la imagen en 32bpp monocromo utilizando una matriz 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 sólo puede hacer un getPixels () y leer el byte más bajo de cada píxel de 32 bits. Si es <128 es un 0, de lo contrario es un 1.

    Bueno, creo que es muy tarde ahora para responder a este hilo, pero yo también estaba trabajando en este material a veces de vuelta y decidí construir mi propia biblioteca que convertirá cualquier imagen jpg o png a 1bpp. Bmp. La mayoría de las impresoras que requieren imágenes 1bpp soportarán esta imagen (probada en una de esas :)). Aquí usted puede encontrar la biblioteca, así como un proyecto de prueba que lo utiliza para hacer una imagen monocromática de un solo canal. Siéntase libre de cambiarlo .. 🙂

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

    Disfrutar..!! 🙂

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

    Las impresoras sólo pueden imprimir cada "píxel" (punto) como monocromo porque cada mancha de tinta tiene sólo 1 color, por lo que deben utilizar puntos mucho más que suficiente y ajustar su tamaño, densidad … para emular la sensación de escala de grises. Esta técnica se llama semitonos . Usted puede ver que las impresoras tienen a menudo resolución por lo menos 600dpi, normalmente 1200-4800dpi, mientras que la pantalla de visualización tops a menudo en 200-300ppi.

    Semitono

    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 utilizar el valor para determinar si el píxel de la imagen de destino 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; 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.