2013-11-12 1 views
4

Привет, ребята, я застрял с этим какое-то время, и я очень хочу понять, как это работает, и чего я не могу получить. У меня есть Apex3, и я без проблем справляюсь с большинством из the documentation, но когда дело доходит до изображений, все становится очень странным (отсутствие примеров + отсутствие согласованности в том, как это сделать).Печать POS/ESC Apex3 image S.O.S

Сначала я пытаюсь наивный подход пытается передать растровое изображение байт [] массив компресса с JPEG и 0 качеством, так как я не имел в виду, с помощью команды

ESC V n1 n2 данные

Это сделали не получается хорошо.

Тогда я обнаружил там андроид библиотеки для apex3, которые принимают растровое изображение и supose печатать его, но он не работает просто печатать странные символы, как это:

enter image description here

Я пытаюсь расшифровать банку источник с использованием JD gui, и они, похоже, выполняют некоторую работу с байтами битмапа, это их код (кусок кода, например addToDoc (m_Document, ESC + «B»), просто введите код в ByteArrayOutputStream данные) (декомпилированный source from here):

public void writeImage(Bitmap imageObject, int printHeadWidth) 
    throws IllegalArgumentException 
    { 
    if (imageObject == null) { 
     throw new IllegalArgumentException("Parameter 'imageObject' was null."); 
    } 
    if (printHeadWidth < 1) { 
     throw new IllegalArgumentException("Parameter 'printHeadWidth' must be greater than 0."); 
    } 
    int height = imageObject.getHeight(); 
    int width = imageObject.getWidth(); 


    byte blanklineCount = 0; 
    byte[] dataline = new byte[printHeadWidth + 7 >> 3]; 
    int[] imageData = new int[height * width]; 

    imageObject.getPixels(imageData, 0, width, 0, 0, width, height); 


    addToDoc(m_Document, ESC + "B"); 
    for (int row = 0; row < height; row++) 
    { 
     boolean blankLine = true; 
     for (int index = 0; index < width; index += 8) 
     { 
     byte currentByte = 0; 
     int offset = row * width + index; 
     if (index >= printHeadWidth) { 
      break; 
     } 
     int value = index + 0 < width ? imageData[(offset + 0)] & 0xFFFFFF : 16777215; 
     boolean set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? -128 : 0)); 

     value = index + 1 < width ? imageData[(offset + 1)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 64 : 0)); 

     value = index + 2 < width ? imageData[(offset + 2)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 32 : 0)); 

     value = index + 3 < width ? imageData[(offset + 3)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 16 : 0)); 

     value = index + 4 < width ? imageData[(offset + 4)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 8 : 0)); 

     value = index + 5 < width ? imageData[(offset + 5)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 4 : 0)); 

     value = index + 6 < width ? imageData[(offset + 6)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 2 : 0)); 

     value = index + 7 < width ? imageData[(offset + 7)] & 0xFFFFFF : 16777215; 
     set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384; 
     currentByte = (byte)(currentByte | (set ? 1 : 0)); 


     dataline[(index >> 3)] = currentByte; 
     blankLine &= currentByte == 0; 
     } 
     if (!blankLine) 
     { 
     if (blanklineCount > 0) 
     { 
      addToDoc(m_Document, "A"); 
      addToDoc(m_Document, blanklineCount); 
      blanklineCount = 0; 
     } 
     addToDoc(m_Document, compressGraphicLine(dataline)); 
     } 
     else 
     { 
     blanklineCount = (byte)(blanklineCount + 1); 
     if (blanklineCount == 255) 
     { 
      addToDoc(m_Document, "A"); 
      addToDoc(m_Document, blanklineCount); 
      blanklineCount = 0; 
     } 
     } 
    } 
    if (blanklineCount > 0) 
    { 
     addToDoc(m_Document, "A"); 
     addToDoc(m_Document, blanklineCount); 
     blanklineCount = 0; 
    } 
    addToDoc(m_Document, ESC + "E"); 
    } 

    private byte[] compressGraphicLine(byte[] dataline) 
    { 
    byte count = 0; 
    byte currentByte = 0; 
    ByteArrayOutputStream rleString = new ByteArrayOutputStream(128); 


    addToDoc(rleString, "G"); 
    for (int index = 0; index < dataline.length; index++) { 
     if (count == 0) 
     { 
     currentByte = dataline[index]; 
     addToDoc(rleString, currentByte); 
     count = (byte)(count + 1); 
     } 
     else if ((count < 255) && (currentByte == dataline[index])) 
     { 
     count = (byte)(count + 1); 
     } 
     else 
     { 
     addToDoc(rleString, count); 
     count = 0; 


     currentByte = dataline[index]; 
     addToDoc(rleString, currentByte); 
     count = (byte)(count + 1); 
     } 
    } 
    if (count > 0) { 
     addToDoc(rleString, count); 
    } 
    if (rleString.size() > dataline.length + 1) 
    { 
     rleString.reset(); 
     addToDoc(rleString, "U"); 
     for (int item = 0; item < dataline.length; item++) { 
     addToDoc(rleString, dataline[item]); 
     } 
    } 
    return rleString.toByteArray(); 
    } 

, но я не понимаю, почему он не работает

Наконец я пытаюсь использовать How can I print an image on a Bluetooth printer in Android? с тем же алгоритмом, как руководство, но по-прежнему печати случайные странные символы.

+0

Мое предположение, что вы не можете распечатать изображение на принтере монохромным его не в протоколе POS принтера для этого принтера. – JPM

+0

Мне нравится не соглашаться в тесте на печать, есть логотип с изображением, поэтому я бы сказал, что это возможно – Necronet

+0

Хотел бы я знать больше, поэтому я мог бы помочь больше, я не программировал POS-принтер годами. – JPM

ответ

2

вместо того, чтобы тратить время на декомпиляцию некоторых apk, почему бы не посмотреть в официальном SDK? На веб-странице изготовителя Downloads & Drivers есть ссылка на Java SDK, которая включает в себя источник Sample.java. В источнике создается BufferedImage, поэтому я думаю (у меня нет такого принтера), это даст вам точку входа для вашей проблемы. И, скорее всего, они предоставляют на той же странице источник для Android-демо Printer Demo Source code for Android

Редактировать Ok. Подведем итог: у вас есть изображение и вы хотите его распечатать. В примере Sample.java этот случай покрывается

BufferedImage newImage = new BufferedImage(1024, 512, BufferedImage.TYPE_4BYTE_ABGR); 
    // some lines and rectangles are drawn in the image 
    ... 
    // the image is printed, following the SDK javadoc for DocumentLP.writeImage 
    // "This will cause the image specified to be printed. Images will be expanded to occupy 
    // the entire width of the printer, so the correct current width of the printer must be 
    // specified. Images that are too wide will be cropped, and images that are too narrow 
    // will be padded on the right." 
    testDoc.writeImage(newImage, m_PrinterWidth); 

Для меня единственные вещи, которые вы должны сделать:

  • создать объект BufferedImage
  • сделать изображение из файла в буферном изображение
  • вызов метода writeImage вашего объекта DocumentLP

редактировать 2 псевдо Фрагмент кода

// taken from SDK javadoc 
DocumentLP docLP; 
docLP = new DocumentLP("$"); 

// own code 
BufferedInputStream bis = new BufferedInputStream(--from your image--); 
BufferedImage bufImage = ImageIO.read(bis); 

// have a look into Sample.java for the expected value of m_PrinterWidth 
testDoc.writeImage(bufImage, m_PrinterWidth); 

редактировать 3 фрагмент кода для Android (взятый из DO_AndroidSDKDemo_MainActivity.Java при условии, с datamax o´neil Android SDK

File file = new File(selectedPath); 
byte[] readBuffer = new byte[(int)file.length()]; 
InputStream inputStream= new BufferedInputStream(new FileInputStream(file)); 
inputStream.read(readBuffer); 
inputStream.close(); 
fileData = readBuffer; 

Bitmap m_imageObject = BitmapFactory.decodeByteArray(fileData, 0, fileData.length); 
documentLP.clear(); 
ocumentLP.writeImage(m_imageObject, m_printHeadWidth); 
+0

, потому что он не работает, он один и тот же декомпилирован, и если вы проверите код, то что они делают, это нарисовать его с помощью холста. Мне нужно отправить растровое изображение. – Necronet

+0

ОК, позвольте мне пояснить только андроид, а Sample.java основан на awt – Necronet

+0

BufferedImage не существует в android, – Necronet

 Смежные вопросы

  • Нет связанных вопросов^_^