Impression d'une Image à l'aide de Bluetooth de l'Imprimante Thermique à Partir d'une Application Android?

J'ai essayé d'obtenir une impression d'une Image mais je n'ai pas été couronnée de succès jusqu'à présent.

L'imprimante est fabriqué localement 2" imprimante thermique ayant une résolution d'impression de 8dots/mm, 384dots/ligne, 203 dpi.
L'imprimante est en fonction d'un conseil d'administration ayant la "NXP 2388 ARM v7 Microproc." avoir une Mémoire FLASH taille de 512 KO de RAM: 128 KO & un Tampon de réception de Taille de 16 KO.

J'ai suivi cette question jusqu'à maintenant.

Problème: L'image, j'ai essayé d'impression est de 576x95 res.
Impression d'une Image à l'aide de Bluetooth de l'Imprimante Thermique à Partir d'une Application Android?

L'image imprimé(avec une erreur d'éclairage à LED et de débogage buzzer de bruit :D) mais l'orientation de l'image est à la verticale au lieu de se faire horizontalement imprimé; que trop à la très côté gauche de la page et la partie supérieure de l'image était de coupure

En supposant ici que j'din pas adopté certaines de drapeaux(tout en faisant le "paquet") compatible avec l'imprimante que j'ai.

Je n'ai pas travaillé sur bluetooth impression avant de sorte que toute aide est appréciable 🙂

Mon Activité Principale:

public class MainActivity extends Activity 
{
//will show the statuses
TextView myLabel;
//will enable user to enter any text to be printed
EditText myTextbox;
EditText devName;
public TableLayout tl2; 
String devid;
String[] pName;
String[] LODQTY;
String[] rte;
String[] stk;
String[] oQty;
String[] oVal;
String[] fQty;
BitSet dots;
int mWidth;
int mHeight;
String mStatus;
String TAG = "TAG";
public String msg;
//android built in classes for bluetooth operations
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
devName = (EditText) findViewById(R.id.etdevice);
devName.setText("BTprinter0377");
String[] product_info = new String[6];
product_info[0] = "CPL400^10^1^0^4^0.4^0";
product_info[1] = "CPL400^10^1^0^4^0.4^0";
product_info[2] = "CPL400^10^1^0^4^0.4^0";
product_info[3] = "CPL400^10^1^0^4^0.4^0";
product_info[4] = "CPL400^10^1^0^4^0.4^0";
product_info[5] = "CPL400^10^1^0^4^0.4^0";
tl2 = (TableLayout) findViewById(R.id.dynSummary);
LayoutInflater inflater = getLayoutInflater();
for (int current = 0; current <= (product_info.length - 1); current++) {
final TableRow row = (TableRow)inflater.inflate(R.layout.table_summary_row, tl2 , false);
TextView tv1 = (TextView)row.findViewById(R.id.tvSkuName);
TextView tv2 = (TextView)row.findViewById(R.id.tvOrderQty);
TextView tv3 = (TextView)row.findViewById(R.id.tvFreeQty);
TextView tv4 = (TextView)row.findViewById(R.id.tvSampleQty);
TextView tv5 = (TextView)row.findViewById(R.id.tvTotalOrderKg);
TextView tv6 = (TextView)row.findViewById(R.id.tvTotalFreeKg);
TextView tv7 = (TextView)row.findViewById(R.id.tvTotalSampleKg);
StringTokenizer tokens = new StringTokenizer(String.valueOf(product_info[current]), "^");
//System.out.println("tokens.nextToken().trim()"+tokens.nextToken().trim());
tv1.setText(tokens.nextToken().trim());
tv2.setText(tokens.nextToken().trim());
tv3.setText(tokens.nextToken().trim());
tv4.setText(tokens.nextToken().trim());
tv5.setText(tokens.nextToken().trim());
tv6.setText(tokens.nextToken().trim());
tv7.setText(tokens.nextToken().trim());
tl2.addView(row);
}
try {
//we have three buttons for specific functions
Button openButton = (Button) findViewById(R.id.open);
Button sendButton = (Button) findViewById(R.id.send);
Button closeButton = (Button) findViewById(R.id.close);
myLabel = (TextView) findViewById(R.id.label);
//open bluetooth connection
openButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
devid = devName.getText().toString().trim();
try {
findBT();
openBT();
} catch (IOException ex) {
}
}
});
//send data typed by the user to be printed
sendButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
sendData();
} catch (IOException ex) {
}
}
});
//close bluetooth connection
closeButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
closeBT();
} catch (IOException ex) {
}
}
});
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* This will find a bluetooth printer device
*/
void findBT() {
try {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
myLabel.setText("No bluetooth adapter available");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
System.out.println("device.getName(): "+device.getName().toString());
if (device.getName().equals("BTprinter0377")) {
mmDevice = device;
break;
}
}
}
myLabel.setText("Bluetooth Device Found");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* Tries to open a connection to the bluetooth printer device
*/
void openBT() throws IOException {
try {
//Standard SerialPortService ID
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
myLabel.setText("Bluetooth Opened");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* After opening a connection to bluetooth printer device, 
* we have to listen and check if a data were sent to be printed.
*/
void beginListenForData() {
try {
final Handler handler = new Handler();
//This is the ASCII code for a newline character
final byte delimiter = 10;
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted()
&& !stopWorker) {
try {
int bytesAvailable = mmInputStream.available();
if (bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for (int i = 0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0,
encodedBytes, 0,
encodedBytes.length);
final String data = new String(
encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable() {
public void run() {
myLabel.setText(data);
}
});
} else {
readBuffer[readBufferPosition++] = b;
}
}
}
} catch (IOException ex) {
stopWorker = true;
}
}
}
});
workerThread.start();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* This will send data to be printed by the bluetooth printer
*/
void sendData() throws IOException {
System.out.println("tl2.getChildCount(): "+tl2.getChildCount());
try {
print_image("/sdcard/tryimg.png");
String msg22;
msg22 = "\n";
msg22 += "PN     Or Fr Sa TOKg TFKg TSKg";
msg22 += "\n";
//mmOutputStream.write(msg22.getBytes());
//tell the user data were sent
myLabel.setText("Data Sent");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* Close the connection to bluetooth printer.
*/
void closeBT() throws IOException {
try {
stopWorker = true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
myLabel.setText("Bluetooth Closed");
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
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());
}
}
private void print_image(String file) throws IOException {
File fl = new File(file);
if (fl.exists()) {
Bitmap bmp = BitmapFactory.decodeFile(file);
convertBitmap(bmp);
mmOutputStream.write(PrinterCommands.SET_LINE_SPACING_24);
int offset = 0;
while (offset < bmp.getHeight()) {
mmOutputStream.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));
}
mmOutputStream.write(slice);
}
}
offset += 24;
mmOutputStream.write(PrinterCommands.FEED_LINE);
mmOutputStream.write(PrinterCommands.FEED_LINE);          
mmOutputStream.write(PrinterCommands.FEED_LINE);
mmOutputStream.write(PrinterCommands.FEED_LINE);
mmOutputStream.write(PrinterCommands.FEED_LINE);
mmOutputStream.write(PrinterCommands.FEED_LINE);
}
mmOutputStream.write(PrinterCommands.SET_LINE_SPACING_30);
} else {
Toast.makeText(this, "file doesn't exists", Toast.LENGTH_SHORT).show();
}
}
}

La PrinterCommands Classe:

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[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 0x64, 0x63, 48, (byte) 255};
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 mentionné dans le dev manuel de l'imprimante(pdf):

Bit Map Image Print
1. Select the image either from PC or from mobile's SD card.
2. Convert the image into monochrome bmp.
3. Resize the image to fit into the printer paper area if it is exceeding
4. Now read the processed image through fileinputstream and save it into byte array.
5. Make the packet of image and then send it to printer over outputstream.

Requis structure de paquet:
Impression d'une Image à l'aide de Bluetooth de l'Imprimante Thermique à Partir d'une Application Android?

Les champs de paquet graphique:
Impression d'une Image à l'aide de Bluetooth de l'Imprimante Thermique à Partir d'une Application Android?

L'alignement de la table & autres infos:
Impression d'une Image à l'aide de Bluetooth de l'Imprimante Thermique à Partir d'une Application Android?

Salut mec, exactement, que faites-vous mal??, pouvez-vous résolu avec l'explique envoyé par la poste??...
Salut pouvez-vous écrire ici la solution de votre problème thx.
désolé je n'ai pas accès au code maintenant. Comme vous pouvez le voir, c'est près d'une année vieille question. Mais je vais essayer de poster si je obtenir mes mains sur. Autant que je sache, la solution a été dépendante de l'API.

OriginalL'auteur beerBear | 2013-06-07