Je dois imprimer des données sur une imprimante thermique bluetooth, c'est ce que je fais :
String message="abcdef any message 12345";
byte[] send;
send = message.getBytes();
mService.write(send);
Cela fonctionne bien pour le texte, mais pas pour les images. Je pense que je dois obtenir le byte[]
des données de l'image. J'ai essayé de récupérer les données de l'image de cette façon :
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.qrcode);
ByteArrayOutputStream stream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image=stream.toByteArray();
Malheureusement, l'imprimante imprime beaucoup de caractères étranges (environ 50 cm de papier). Je ne sais pas comment imprimer l'image.
J'aimerais essayer de récupérer les pixels de l'image bitmap et de la convertir ensuite en un fichier de type byte[]
et l'envoyer, mais je ne sais pas comment faire.
Merci
UPDATE :
Après tant de temps, je fais ça : J'ai une méthode appelée print_image(String file), qui récupère le chemin de l'image que je veux imprimer :
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();
}
}
Je l'ai fait en me basant sur ceci poste
Voici la classe 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};
}
Comme on le voit dans la méthode print_image, j'appelle une méthode, appelée convertBitmap, et j'envoie un bitmap, voici le 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());
}
}
C'est le imprimante que j'utilise, résolution : 8 points/mm, 576 points/ligne.
Et voici ce que j'aime faire (je l'ai fait avec la même imprimante, mais avec une application téléchargée sur play store)
Voici ce que j'obtiens maintenant
Plus près :
Closer2 :
Une petite partie de l'image peut être vue, donc je pense que je suis plus proche de pouvoir imprimer l'image...
L'image que j'utilise est la suivante (576x95) :
Et voici l'image convertie (je la convertis avec le code supérieur) :
Donc, la réponse est : qu'est-ce que je fais de mal ? Je pense que l'erreur se trouve dans cette commande :
public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, -128, 0};
Mais, comment puis-je calculer les valeurs correctes pour mon image ? merci.
0 votes
Oui, je l'ai envoyé de la même façon que le premier extrait.
mService.write(image)
L'imprimante a un SDK mais il ne compile pas, donc je ne sais pas comment le faire.0 votes
Si vous avez les sources du SDK, vous pouvez voir comment ils procèdent.
0 votes
Maintenant, je l'ai décompilé, ils utilisent une méthode pour retourner le tableau byte[], mais cela ne fonctionne pas, j'ai implémenté cette méthode mais quand je lance l'application sur la tablette, elle meurt, générant une erreur de fermeture forcée.... ``
0 votes
J'ai juste la bibliothèque .jar, c'est le SDK proportionné par l'imprimante... Mais je ne l'utilise pas car il ne fonctionne pas pour moi, il ne compile pas... Je n'obtiens aucune erreur dans la trace de la pile... Quand j'essaie d'imprimer une image, elle s'imprime normalement, mais pas l'image, elle s'imprime avec des caractères étrangers...
0 votes
@nlsbshtr Je recommande le Bixolon SPP-R200. Cependant, nous n'utilisons pas le SDK officiel pour imprimer, mais nous avons plutôt implémenté nos propres procédures d'appairage et d'impression.
0 votes
Il est difficile de donner des suggestions sans le SDK, mais ce que nous faisons pour imprimer des images : Nous les convertissons en bitmaps monochromes et pendant la conversion, nous écrivons chaque pixel converti dans un tableau d'octets. La taille maximale du tableau d'octets est déterminée par : la largeur maximale d'impression de l'imprimante * bitmap.getHeight() / 8 . Pour la conversion monochrome, nous avons transformé en noir chaque pixel dont la couleur RVB était < 128 et en blanc, si la couleur RVB était >= 128.
0 votes
Cependant, le SDK de Bixolon, par exemple, vous permet de transmettre des images sans avoir à les convertir en monochrome au préalable, car le SDK s'en charge. Cependant, pour une raison insondable, il n'était pas possible d'imprimer simplement une image en mémoire (le SDK ne proposait tout simplement pas cette option), nous avons donc dû envoyer nous-mêmes les octets à l'imprimante.
0 votes
Je convertis l'image en un bmp monochrome, en faisant ce que vous dites... Mais j'ai besoin de récupérer ce BMP et de l'imprimer... Savez-vous comment faire ? ou pouvez-vous me donner un exemple en utilisant le SDK de bixolon, j'utilise une imprimante REGO mais son SDK ne fonctionne pas.
0 votes
@LeonardoSapuy Bonjour, Pouvez-vous s'il vous plaît m'aider ici : stackoverflow.com/questions/16982485/ J'ai un problème similaire :(
0 votes
Non, désolé, si vous voulez je peux vous envoyer le projet de test.
0 votes
Bonjour Leonardo Sapuy, pouvez-vous nous dire comment vous avez résolu le problème ?
0 votes
Pouvez-vous partager le code entier s'il vous plaît
0 votes
Lien utile : developer.Android.com/training/printing/photos#image