Wie kann ich ein Bild drucken auf einem Bluetooth-Drucker in Android?
Habe ich zu drucken, werden einige Daten auf die thermische bluetooth-Drucker, mache ich mit diesem:
String message="abcdef any message 12345";
byte[] send;
send = message.getBytes();
mService.write(send);
Es funktioniert gut für text, aber nicht für Bilder. Ich glaube, ich brauche, um die byte[]
von der Bild-Daten. Ich habe versucht immer die Daten von der Bild so:
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.qrcode);
ByteArrayOutputStream stream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image=stream.toByteArray();
Leider druckt der Drucker eine Menge von seltsamen Zeichen (ca. 50 cm Papier). Ich weiß nicht, wie das Bild zu drucken.
Möchte ich versuchen, immer die Pixel der bitmap und als Nächstes die Konvertierung in ein byte[]
und senden Sie es, aber ich weiß nicht, wie es zu tun.
Dank
UPDATE:
Nach so viel Zeit, ich bin dabei: ich habe eine Methode namens print_image(String Datei), die bekommt den Pfad zum Bild, das ich drucken möchten:
private void print_image(String file) {
File fl = new File(file);
if (fl.exists()) {
Bitmap bmp = BitmapFactory.decodeFile(file);
convertBitmap(bmp);
mService.write(PrinterCommands.SET_LINE_SPACING_24);
int offset = 0;
while (offset < bmp.getHeight()) {
mService.write(PrinterCommands.SELECT_BIT_IMAGE_MODE);
for (int x = 0; x < bmp.getWidth(); ++x) {
for (int k = 0; k < 3; ++k) {
byte slice = 0;
for (int b = 0; b < 8; ++b) {
int y = (((offset / 8) + k) * 8) + b;
int i = (y * bmp.getWidth()) + x;
boolean v = false;
if (i < dots.length()) {
v = dots.get(i);
}
slice |= (byte) ((v ? 1 : 0) << (7 - b));
}
mService.write(slice);
}
}
offset += 24;
mService.write(PrinterCommands.FEED_LINE);
mService.write(PrinterCommands.FEED_LINE);
mService.write(PrinterCommands.FEED_LINE);
mService.write(PrinterCommands.FEED_LINE);
mService.write(PrinterCommands.FEED_LINE);
mService.write(PrinterCommands.FEED_LINE);
}
mService.write(PrinterCommands.SET_LINE_SPACING_30);
} else {
Toast.makeText(this, "file doesn't exists", Toast.LENGTH_SHORT)
.show();
}
}
Ich habe es auf dieser Basis post
Dies ist die Klasse PrinterCommands:
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, -128, 0};
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};
}
Als ist gesehen in der print_image Methode rufe ich eine Methode, genannt convertBitmap, und im das senden einer bitmap, das ist der code:
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 < height; x++) {
for (int y = 0; y < 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 < 55) {
dots.set(k);//this is the bitset that i'm printing
}
k++;
}
}
} catch (Exception e) {
//TODO: handle exception
Log.e(TAG, e.toString());
}
}
Dies ist die Druckerdie ich verwende, Auflösung: 8 Punkte/mm, 576 dots/line
Und das ist, was ich mag zu tun (ich habe es mit dem gleichen Drucker, aber mit einer app heruntergeladen aus dem play store)
Dies ist, was ich bin jetzt zu bekommen
Näher:
Closer2:
Einen kleinen Teil des Bildes gesehen werden kann, so dass ich denke, ich bin näher an das drucken des Bildes...
Dem Bild, das ich verwende, ist dieser (576x95):
- Und dies ist der konvertierte Bild (ich bin konvertieren Sie es mit dem oberen code):
So, die Antwort ist: was mache ich falsch?, Ich denke, dass der Fehler in diesem Befehl:
public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, -128, 0};
Aber, wie kann ich berechnen, die richtigen Werte für mein Bild?, Dank
InformationsquelleAutor der Frage Leonardo Sapuy | 2013-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich es lösen Konvertierung der Bitmap in Byte-array. Denken Sie daran, dass das Bild muss schwarz & weiß-format.
Für vollständige code:
https://github.com/imrankst1221/Thermal-Printer-in-Android
InformationsquelleAutor der Antwort Md Imran Choudhury
Gelöst!, Ich hatte einen falschen Drucker initialisieren... Der korrekte Weg ist:
So, durch diese Art, wie das Bild gedruckt wird, völlig in Ordnung
InformationsquelleAutor der Antwort Leonardo Sapuy
BEARBEITEN: Update, basierend auf der Lektüre Ihrer Frage: https://stackoverflow.com/questions/16597789/print-bitmap-on-esc-pos-printer-java
Gehe ich davon aus, dass der Drucker Sie zum drucken ist das gleiche wie oben, d.h. die Rego Thermal-Drucker. Dies ist, wie Sie beachten Sie, unterstützen Sie die ESC/POS-Seite Beschreibung Sprache.
Drucker interpretieren Daten gestreamt werden, um Sie entweder als eine markierte Dokument (in einer ähnlichen Weise, wie der browser interpretieren HTML). In einigen Fällen, der Drucker läuft buchstäblich das Dokument als ein Programm (z.B. PostScript). Link: Seite Beschreibung Sprachen.
Gemeinsamen Sprachen sind:
Bitte Lesen Sie die Spezifikationen für Ihren Drucker zu bestimmen, welche Sprache zu verwenden - wenn Sie unterstützen müssen alle Drucker, dann haben Sie eine sehr große Aufgabe vor Ihnen 🙁
In ESC/POS, benötigen Sie die
GS v 0
Befehl (dokumentiert auf p33). Sie tun das, indem Sie die Zeichen0x1D7630
über die serielle Verbindung, gefolgt von einer Reihe von Argumenten:Parameter-Definitionen:
Hinweise:
Gibt es mehrere umfangreiche Ausstellungen:
Leider gibt es keine Drucker-API in Android. Wenn Sie sich stark fühlen über diese, Folgen Sie diesen Themen:
InformationsquelleAutor der Antwort Andrew Alcock
Ich auch versucht, und ich habe meine eigene Lösung, und ich denke, ich fand heraus, wie die
SELECT_BIT_IMAGE_MODE
Befehl funktioniert.Den Befehl
public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, 255, 3};
in der KlassePrinterCommands
ist die POS-Befehl für die Bilder zu drucken.Die ersten beiden sind ziemlich standard, die nächsten drei den Modus bestimmen und die Maße des Bilds gedruckt werden. Für die Zwecke dieser Lösung, lassen Sie uns einfach davon ausgehen, dass das zweite element (33, wir sind indizierte null) ist immer 33.
Den letzten zwei Elemente, byte[] bezieht sich auf die Breite (in Pixel) Eigenschaft des Bildes, das Sie drucken möchten, element 3 wird manchmal als
nL
und element 4 wird manchmal alsnH
. Sie sind eigentlich sowohl auf die Breite, dienL
ist dieLow Byte
währendnH
ist dieHigh Byte
. Dies bedeutet, dass wir bei der haben die meisten ein Bild mit einer Breite von 1111 1111 1111 1111b (Binär), die 65535d (dezimal), obwohl ich habe nicht versucht es noch nicht. Wenn die nL oder nH sind nicht festgelegt auf die richtigen Werte, dann wird es Papierkorb-Zeichen gedruckt, zusammen mit dem Bild.Irgendwie, Android docs erzählt uns, dass die Grenzen der Wert für ein byte in ein byte-array ist -128 und +127, wenn ich versuchte, in 255, Eclipse fragte mich, werfe es Byte.
Sowieso, zurück zu nL und nW, für Ihren Fall, Sie haben ein Bild mit Breite 576, wenn wir konvertieren 576 Binary, bekommen wir zwei bytes, die gehen würde, wie:
0000 0010 0100 0000
In diesem Fall das Low-Byte ist
0100 0000
während das High-Byte ist0000 0010
. Konvertieren zurück zu dezimal und wir bekommennL = 64
undnH = 2
.In meinem Fall, ich druckte ein Bild, hat eine Breite von 330px, Umwandlung von 330 auf binäre erhalten wir:
0000 0001 0100 1010
In diesem Fall jetzt, das Low-Byte ist
0100 1010
- und das High-Byte ist0000 0001
. Konvertieren Sie Sie in Dezimalformat erhalten wirnL = 74
undnH = 1
.Für mehr Informationen, schauen Sie sich diese Dokumentation/tutorials:
Star Asia Mobile Drucker-Dokumentation
ECS-POS-Programmierhandbuch - sehr umfangreich
Eine Weitere Dokumentation
Die erweiterte version der code oben, mit mehr Erklärung
Erklärung der code oben
Hoffe diese hilft.
InformationsquelleAutor der Antwort
Weiß ich evolute und AMDL bluetooth-Drucker.Lesen Sie zuerst die Protokoll-Begriff Dokument an den Drucker, der Ihnen sagt, was bestimmte bytes, die Sie benötigen für das Gerät-
Nachdem die Verbindung durch den oben genannten code, erhalten Sie den Ausgabestrom des Sockets.Dann konvertieren Sie Ihre Bild, um das entsprechende byte durch das Werkzeug bereitgestellt, mit dem Drucker erhalten Sie so etwas wie
wo 8A ist ab byte-C6-Modus-byte (verschiedene für die smart-Karte , streichen und Fingerabdruck) , 94 ist font-byte und das Letzte byte 04 ist das Ende-byte erzählt die hardware, dass dies Ende des Pakets.Je nach Größe des Bildes erhalten Sie mehrere dieser Pakete der Länge 256 byte (die meisten Drucker).Schreiben Sie an den Ausgabestrom.
InformationsquelleAutor der Antwort mjosh
Ich bin neu auf ESC/POS-und bin mit ihm zu kämpfen. Ich stieß auf diese Seite, die scheint, haben einige nützliche Funktionen: http://code.taobao.org/p/printer/src/trunk/prtest/src/com/enjar/plugins/PrintTools_58mm.java
Es ist in der chinesischen, aber doch Wert sein könnte. Wenn das jemand herausfindet, würde ich mag, um erleuchtet zu...
InformationsquelleAutor der Antwort just some guy
verwenden Sie diesen code:
InformationsquelleAutor der Antwort TalDroid