2016-05-16 27 views
2

Mit Esc/Pos möchte ich ein Bitmap-Bild in den NV-Grafikspeicher eines Druckers hochladen.JAVA ESC POS NV-Grafik auf Drucker hochladen

Ich verwende GS (L/GS 8 L<Function 67> der Esc/Pos Handbuch.

Ich kann <Function 65> und <Function 66> verwenden, um alle oder eine der Grafiken zu löschen.

Ich weiß, ich vermisse etwas beim Hinzufügen der Bitmap zu der Funktion.

Heres ist meine Befehlszeichenfolge einschließlich der Bitmap. Die bitmapString hat den Datei-Header und Info-Header des Bitmap entfernt (erstes 62 Bytes) (Dataoffset) .:

String bitmapString = new String(bitmapBytes, Charsets.US_ASCII); 
bitmapString = bitmapString.substring(DataOffset, bitmapStringSize); 
String commandString = ""; 

int commandLength = (bitmapStringSize.length) + 11; 
    pL = commandLength % 256; 
    if (commandLength < 256) { 
     pH = 0; 
    } else { 
     pH = (commandLength - pL)/256; 
    } 

    xL = bitmapWidth % 256; 
    if (bitmapWidth < 256) { 
     xH = 0; 
    } else { 
     xH = (bitmapWidth - (bitmapWidth % 256))/256; 
    } 

    yL = bitmapHeight % 256; 
    if (bitmapHeight < 256) { 
     yH = 0; 
    } else { 
     yH = (bitmapHeight - (bitmapHeight % 256))/256; 
    } 

    commandString 
      += Utils.H("1B")// 27 
      + Utils.H("40") // 64 
      + Utils.H("1B") // 27 
      + Utils.H("3D") // 61 
      + Utils.H("01") // 1 

      + Utils.H("1D") // GS = 29 
      + Utils.H("28") // (= 40 
      + Utils.H("4C") // L = 76 

      + Utils.D(pL) // pL 
      + Utils.D(pH) // pH 

      + Utils.H("30") // m = 48 
      + Utils.H("43") // fn = 67 
      + Utils.H("30") // a = 48 

      + Utils.H(KC1) // kc1 
      + Utils.H(KC2) // kc2 

      + Utils.H("01") // b = 1 

      + Utils.D(xL) // xL 
      + Utils.D(xH) // xH 
      + Utils.D(yL) // yL 
      + Utils.D(yH) // yH 

      + Utils.H("31");// c = 49 

    commandString += bitmapString; 

Ich verwende ePOS-Print.jar an den Drucker zu öffnen und schreiben:

EpsonIo epsonio = new EpsonIo(); 
byte[] commandBytes = commandString.getBytes(Charsets.US_ASCII); 

     epsonio.open(DevType.BLUETOOTH, MAC, null, ESCPosService.this); 

     while (n > 0) { 

      epsonio.write(commandBytes, i, n > bufferSize ? bufferSize : n, SEND_TIMEOUT); 

      Thread.sleep(450); 

      i += bufferSize; 
      n -= bufferSize; 
     } 

Aber wenn ich die Grafik gedruckt wird verzerrt:

enter image description here

Antwort

2

ich das Problem gelöst haben.

Die Bitmap-Bytes, die gesendet werden, müssen mit der folgenden Methode dekodiert werden. Die Methode konvertiert die Bitmap-Pixel in monochrome Bytes. 1 oder 0.

Hoffe, diese Hilfe ist jemand, wenn die Zukunft!

public static byte[] decodeBitmap(byte[] bitmapBytes) { 

    Bitmap bmp = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length); 

    int zeroCount = bmp.getWidth() % 8; 
    String zeroStr = ""; 
    if (zeroCount > 0) { 
     for (int i = 0; i < (8 - zeroCount); i++) { 
      zeroStr = zeroStr + "0"; 
     } 
    } 

    List<String> list = new ArrayList<>(); 
    for (int i = 0; i < bmp.getHeight(); i++) { 
     StringBuilder sb = new StringBuilder(); 
     for (int j = 0; j < bmp.getWidth(); j++) { 
      int color = bmp.getPixel(j, i); 

      int r = (color >> 16) & 0xff; 
      int g = (color >> 8) & 0xff; 
      int b = color & 0xff; 

      // if color close to white,bit='0', else bit='1' 
      if (r > 160 && g > 160 && b > 160) 
       sb.append("0"); 
      else 
       sb.append("1"); 
     } 
     if (zeroCount > 0) { 
      sb.append(zeroStr); 
     } 

     list.add(sb.toString()); 
    } 

    List<String> bmpHexList = binaryListToHexStringList(list); 
    List<String> commandList = new ArrayList<>(); 
    commandList.addAll(bmpHexList); 

    return hexListToBytes(commandList); 
}