public class ZplImage {
// private static List
public class PrintTemplate {
private static final String TAG = "PrintTemplate";
private BluetoothSocket mBluetoothSocket;
private static final int CONNECTFAILURE=1;
private static final int CONNECTSUCCESS=2;
Message message=new Message();
AlertDialog alertDialog=null;
private Context context;
private Handler handler=new Handler(){
public void handleMessage(Message message){
switch (message.what){
case CONNECTFAILURE:
MSG.say(context,"连接失败");
break;
case CONNECTSUCCESS:
MSG.say(context,"连接成功开始打印");
break;
default:
break;
}
}
};
public void printConnect(final Context context, final int type) {
this.context=context;
//判断是否选择了打印机
SharedPreferences sharedPreferences=context.getSharedPreferences("print",MODE_PRIVATE);
final String printeraddress=sharedPreferences.getString("PRINTERADDRESS","");//调试的时候可以自己先存一个打印机的地址进去
if (Util.isNull(printeraddress)){
DialogMessage.show(context,"请前往打印设置,选择打印设备");
return;
}
//查看蓝牙有没有打开
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//获取蓝牙的适配器
if (bluetoothAdapter != null && !bluetoothAdapter.isEnabled()) {//适配器不为空,且蓝牙没有打开
final Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
enableBtIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(enableBtIntent);
}
bluetoothAdapter.cancelDiscovery();
alertDialog=new AlertDialog.Builder(context)
.setTitle("提示")
.setMessage("正在连接")
.setCancelable(false)
.create();
alertDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
try {
UUID uuid=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Log.d(TAG, "print: "+bluetoothAdapter.getRemoteDevice(printeraddress).getName());
mBluetoothSocket = bluetoothAdapter.getRemoteDevice(printeraddress).createRfcommSocketToServiceRecord(uuid);
mBluetoothSocket.connect();
if (!mBluetoothSocket.isConnected()){
alertDialog.dismiss();
message.what=CONNECTFAILURE;
handler.sendMessage(message);
return;
}else{
alertDialog.dismiss();
message.what=CONNECTSUCCESS;
handler.sendMessage(message);
print(type);//进行打印
}
} catch (IOException e) {
e.printStackTrace();
alertDialog.dismiss();
message.what=CONNECTFAILURE;
handler.sendMessage(message);
}
}
}).start();
}
/****************************打印*********************/
private void print(final int type){
new Thread(new Runnable() {
@Override
public void run() {
try {
if (mBluetoothSocket.isConnected()){
OutputStream mOutputStream = mBluetoothSocket.getOutputStream();
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(mOutputStream);
Bitmap bm=null;
switch (type){
case 1:
bm= draw(Util.replaceNullByBackspace("CG0055949400026550002"),Util.replaceNullByBackspace("G-596809"),Util.replaceNullByBackspace("20170906"),Util.replaceNullByBackspace("3pcs*12CTV"),Util.replaceNullByBackspace("12"),Util.replaceNullByBackspace("36"),Util.replaceNullByBackspace("9343864-04"),Util.replaceNullByBackspace("北京金佰利公司"),Util.replaceNullByBackspace("01.01.01.01.00"));
break;
case 2:
bm=draw2(Util.replaceNullByBackspace("CG0055949400026550002"),Util.replaceNullByBackspace("G-596809"),Util.replaceNullByBackspace("20170906"),Util.replaceNullByBackspace("3pcs*12CTV"),Util.replaceNullByBackspace("12"),Util.replaceNullByBackspace("36"),Util.replaceNullByBackspace("9343864-04"));
break;
case 3:
bm=draw2(Util.replaceNullByBackspace("CG0055949400026550002"),Util.replaceNullByBackspace("G-596809"),Util.replaceNullByBackspace("20170906"),Util.replaceNullByBackspace("3pcs*12CTV"),Util.replaceNullByBackspace("12"),Util.replaceNullByBackspace("36"),Util.replaceNullByBackspace("9343864-04"));
break;
default:
break;
}
String content= ZplImage.getHexByChange2bit(bm);
content=content+"^XA^XGR:ZLOGO.GRF,1,1^XZ";//增加打印指令
String str=content;
int j=content.length()/2000;
int i=0;
while (i
PrintTemplate printTemplate=new PrintTemplate();
printTemplate.printConnect(context,1);
打印出来的效果图
(https://www.cnblogs.com/rinack/p/4843788.html)
相关指令的介绍:比较全的斑马打印机指令合集
~DG(下载图象)执行以下功能。
1.置打印机为图象模式。
2.命名图形。(这个名字将用来在标签中调用)
3.定义图象尺寸
4.下载十六进制字符串到打印机
指令的格式:
~DGd:o.x,t,w,DATA
~DG | 设置打印机为下载图形模式 |
---|---|
d | 贮存图象的目标设备。 缺省值:R: (DRAM) 其它值:B: (内存选件) |
o | 图象名,1-8字符,(缺省时,用UNKNOWN作字体名) |
x | 扩展名,3字符 ( 固定的,始终是:GRF) |
t | 图象总的字节数 |
w | 每行字节数 |
DATA | ASCII十六进制串图象定义 |
如目标名省略,就用UNKNOWN.GRF作为字图象名。数据串使用ASCII十六进制串图象定义,每个字符表示水平方向的四个点。
以下是一个用~DG指令加载图象到DRAM的例子。贮存图象名叫SAMPLE.GRF。
~DGR:SAMPLE.GRF,00080,010,
FFFFFFFFFFFFFFFFFFFF
8000FFFF0000FFFF0001
8000FFFF0000FFFF0001
8000FFFF0000FFFF0001
FFFF0000FFFF0000FFFF
FFFF0000FFFF0000FFFF
FFFF0000FFFF0000FFFF
FFFFFFFFFFFFFFFFFFFF
参数t(图形总字节数)用以下公式计算:
X (毫米)×打印机分辨率(点/毫米) × Y(毫米) ×打印机分辨(点/毫米)/8(点/字节)= 总字节
X 是单位毫米的图象宽度。Y是单位毫米的图象高度。点/毫米打印机编程的打印分辨率。
例如,确定图象8毫米宽,16毫米高,打印分辨率8点/毫米的正确t参数其公式是:
8×8×16×8/8=1024字节
参数w(每行字节数)用以下公式计算:
X (毫米)×打印机分辨率(点/毫米) /8(点/字节)= 每行字节数
x是单位毫米的图象宽充,点/毫米是打印机偏移打印分辨率。
例如,确定图象8毫米宽,打印分辨率8点/毫米的正确w参数,其公式是:
8×8/8 = 8字节
注意:
所有字节中一行的字节
w是t参数计算的第一个值
参数是一串十六进制数作为图象表示送打印机。每一十六进制字符代表水平方向四个点。如图象前四个点是白的,后四个点是黑的。二进制码的点00001111。十六进制表示二进制值将是OF。完整的图象码就是这样。完整图象被送打印机是一长连续十六制值。
相关代码
相关思路:获取到bitmap图片后,查询每一像素点的颜色的int值,如果不是纯白色(-1),就当作黑色处理,(我是图方便,这样其实会出现很多不该出现的小黑点,其实应该是用中间的灰色当作分界线会好一点,如果比灰色的数值大,那么当作白色,比灰色的数值小,当作黑色)
(我采用的热敏打印机打印标签)
打印机是一个字节的代表八个点,一个点只有两种颜色,要不是黑色不是白色(0为白色,1为黑色)。每获取到4个像素点,就将他们拼接成一个16进制。
我采用的是TD-2130N的打印机,基本上好像智能接受8000字节左右,所以相当于8000*8=640000个像素点。当然实际情况可以比它大,毕竟可以采用压缩指令。但是这个像素点是基本上安全可以打印的。得到了相应的hex之后,就利用指令码进行压缩