title: Printing an image on POS/ESC thermal printer Android
body: <p>I am trying to print a logo on a Bluetooth pos/esc thermal printer, the image being printed is this bad characters or junk characters. If you have an answer of what am doing wrong, or where am doing things wrong in the below please help. I tried this code "<em><a href="https://stackoverflow.com/questions/14530058/how-can-i-print-an-image-on-a-bluetooth-printer-in-android">stack overflow-How can I print an image on a Bluetooth printer in Android?</a></em>" out still not working
  The image am currently using is: </p>
  
  <p><img src="https://i.stack.imgur.com/tPqel.png" alt="576px width X 95px height"></p>
  
  <p>My current code is.</p>
  
  <pre><code>public void print_image() {
  
      try {
          mOutputStream = mSocket.getOutputStream();
  
             Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.logo1);
  
              convertBitmap(bmp);
              mOutputStream.write(PrinterCommands.SET_LINE_SPACING_24);
  
          int offset = 0;
          while (offset &lt; bmp.getHeight()) {
              mService.write(PrinterCommands.SELECT_BIT_IMAGE_MODE);
              for (int x = 0; x &lt; bmp.getWidth(); ++x) {
  
                  for (int k = 0; k &lt; 3; ++k) {
  
                      byte slice = 0;
                      for (int b = 0; b &lt; 8; ++b) {
                          int y = (((offset / 8) + k) * 8) + b;
                          int i = (y * bmp.getWidth()) + x;
                          boolean v = false;
                          if (i &lt; dots.length()) {
                              v = dots.get(i);
                          }
                          slice |= (byte) ((v ? 1 : 0) &lt;&lt; (7 - b));
                      }
                      mService.write(slice);
                  }
              }
              offset += 24;
                  mOutputStream.write(PrinterCommands.FEED_LINE);
                  mOutputStream.write(PrinterCommands.FEED_LINE);
                  mOutputStream.write(PrinterCommands.FEED_LINE);
                  mOutputStream.write(PrinterCommands.FEED_LINE);
                  mOutputStream.write(PrinterCommands.FEED_LINE);
                  mOutputStream.write(PrinterCommands.FEED_LINE);
              }
              mOutputStream.write(PrinterCommands.SET_LINE_SPACING_30);
  
  
  
      }catch (Exception e){
          Log.e("errorme",e.getMessage());
      }
  }
  public String convertBitmap(Bitmap inputBitmap) {
  
      mWidth = inputBitmap.getWidth();
      mHeight = inputBitmap.getHeight();
  
      convertArgbToGrayscale(inputBitmap, mWidth, mHeight);
      mStatus = "ok";
      return mStatus;
  }
  
  private void convertArgbToGrayscale(Bitmap bmpOriginal, int width,
                                      int height) {
      int pixel;
      int k = 0;
      int B = 0, G = 0, R = 0;
      dots = new BitSet();
      try {
  
          for (int x = 0; x &lt; height; x++) {
              for (int y = 0; y &lt; width; y++) {
                  // get one pixel color
                  pixel = bmpOriginal.getPixel(y, x);
  
                  // retrieve color of all channels
                  R = Color.red(pixel);
                  G = Color.green(pixel);
                  B = Color.blue(pixel);
                  // take conversion up to one single value by calculating
                  // pixel intensity.
                  R = G = B = (int) (0.299 * R + 0.587 * G + 0.114 * B);
                  // set bit into bitset, by calculating the pixel's luma
                  if (R &lt; 55) {
                      dots.set(k);//this is the bitset that i'm printing
                  }
                  k++;
              }
          }
  
      } catch (Exception e) {
          // TODO: handle exception
          Log.e(TAG, e.toString());
      }
  
  }
  </code></pre>
  
  <p>then i have a class called printer commands which is below.</p>
  
  <pre><code>public class PrinterCommands {
      public static final byte[] INIT = {27, 64};
      public static byte[] FEED_LINE = {10};
  
      public static byte[] SELECT_FONT_A = {27, 33, 0};
  
      public static byte[] SET_BAR_CODE_HEIGHT = {29, 104, 100};
      public static byte[] PRINT_BAR_CODE_1 = {29, 107, 2};
      public static byte[] SEND_NULL_BYTE = {0x00};
  
      public static byte[] SELECT_PRINT_SHEET = {0x1B, 0x63, 0x30, 0x02};
      public static byte[] FEED_PAPER_AND_CUT = {0x1D, 0x56, 66, 0x00};
  
      public static byte[] SELECT_CYRILLIC_CHARACTER_CODE_TABLE = {0x1B, 0x74, 0x11};
  
      public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte)255, 3};
      public static byte[] SET_LINE_SPACING_24 = {0x1B, 0x33, 24};
      public static byte[] SET_LINE_SPACING_30 = {0x1B, 0x33, 30};
  
      public static byte[] TRANSMIT_DLE_PRINTER_STATUS = {0x10, 0x04, 0x01};
      public static byte[] TRANSMIT_DLE_OFFLINE_PRINTER_STATUS = {0x10, 0x04, 0x02};
      public static byte[] TRANSMIT_DLE_ERROR_STATUS = {0x10, 0x04, 0x03};
      public static byte[] TRANSMIT_DLE_ROLL_PAPER_SENSOR_STATUS = {0x10, 0x04, 0x04};
  }
  </code></pre>
  
  <p>I found somewhere that is what that matters when printing <code>public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte)255, 3};</code>.
  I tried changing that using images of different width pixel sizes. <code>mOutputStream = mSocket.getOutputStream();</code> means I am getting an output stream from a bluetoothsocket i.e. Bluetoothsocket mSocket.</p>