当前位置: 代码迷 >> Android >> android pos机打印小票 图片打印,该如何解决
  详细解决方案

android pos机打印小票 图片打印,该如何解决

热度:80   发布时间:2016-04-28 01:26:15.0
android pos机打印小票 图片打印
 图片怎么转换为图像点阵数据,求大神!!!!
------解决思路----------------------
这个以前做过,就是先将图片二值化(非黑即白),在重绘图片,你需要打印多大的图片,还有你需要知道打印机的打印指令(即每一行打印多少byte)。把我以前的代码贴给你吧。
package com.woyou.util;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.Log;

/**
 * 将图片转化为二进制
 * @author nsz
 * 2015年1月30日
 */
public class PicFromPrintUtils {


public void init(){
// Gray = 0.29900 * R + 0.58700 * G + 0.11400 * B
}

/*************************************************************************
 * 我们的热敏打印机是RP-POS80S或RP-POS80P或RP-POS80CS或RP-POS80CP打印机
 * 360*360的图片,8个字节(8个像素点)是一个二进制,将二进制转化为十进制数值
 * y轴:24个像素点为一组,即360就是15组(0-14)
 * x轴:360个像素点(0-359)
 * 里面的每一组(24*360),每8个像素点为一个二进制,(每组有3个,3*8=24)
 **************************************************************************/
/**
 * 把一张Bitmap图片转化为打印机可以打印的bit(将图片压缩为360*360)
 * 效率很高(相对于下面)
 * @param bit
 * @return
 */
public static byte[] draw2PxPoint(Bitmap bit) {    
byte[] data = new byte[16290];
int k = 0;
for (int j = 0; j < 15; j++) {
data[k++] = 0x1B;
data[k++] = 0x2A;
data[k++] = 33; // m=33时,选择24点双密度打印,分辨率达到200DPI。
data[k++] = 0x68;
data[k++] = 0x01;
for (int i = 0; i < 360; i++) {
for (int m = 0; m < 3; m++) {
for (int n = 0; n < 8; n++) {
byte b = px2Byte(i, j * 24 + m * 8 + n, bit);
data[k] += data[k] + b;
}
k++;
}
}
data[k++] = 10;
}
return data;
}

/**
 * 把一张Bitmap图片转化为打印机可以打印的bit
 * @param bit
 * @return
 */
public static byte[] pic2PxPoint(Bitmap bit){
long start = System.currentTimeMillis();
byte[] data = new byte[16290];
int k = 0;
for (int i = 0; i < 15; i++) {
data[k++] = 0x1B;
data[k++] = 0x2A;
data[k++] = 33; // m=33时,选择24点双密度打印,分辨率达到200DPI。
data[k++] = 0x68;
data[k++] = 0x01;
for (int x = 0; x < 360; x++) {
for (int m = 0; m < 3; m++) {
byte[]  by = new byte[8];
for (int n = 0; n < 8; n++) {
byte b = px2Byte(x, i * 24 + m * 8 +7-n, bit);
by[n] = b;
}
data[k] = (byte) changePointPx1(by);
k++;
}
}
data[k++] = 10;
}
long end = System.currentTimeMillis();
long str = end - start;
Log.i("TAG", "str:" + str);
return data;
}

/**
 * 图片二值化,黑色是1,白色是0
 * @param x  横坐标
 * @param y  纵坐标
 * @param bit 位图
 * @return
 */
public static byte px2Byte(int x, int y, Bitmap bit) {
byte b;
int pixel = bit.getPixel(x, y);
int red = (pixel & 0x00ff0000) >> 16; // 取高两位
int green = (pixel & 0x0000ff00) >> 8; // 取中两位
int blue = pixel & 0x000000ff; // 取低两位
int gray = RGB2Gray(red, green, blue);
if ( gray < 128 ){
b = 1;
} else {
b = 0;
}
return b;
}

/**
 * 图片灰度的转化
 * @param r  
 * @param g
 * @param b
 * @return
 */
private static int RGB2Gray(int r, int g, int b){
int gray = (int) (0.29900 * r + 0.58700 * g + 0.11400 * b);  //灰度转化公式
return  gray;
}

/**
 * 对图片进行压缩(去除透明度)
 * @param bitmapOrg
 */
public static Bitmap compressPic(Bitmap bitmapOrg) {
// 获取这个图片的宽和高
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
// 定义预转换成的图片的宽度和高度
int newWidth = 360;
int newHeight = 360;
Bitmap targetBmp = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);  
Canvas targetCanvas = new Canvas(targetBmp);
targetCanvas.drawColor(0xffffffff);
targetCanvas.drawBitmap(bitmapOrg, new Rect(0, 0, width, height), new Rect(0, 0, newWidth, newHeight), null);
return targetBmp;
}


/**
 * 对图片进行压缩(不去除透明度)
 * @param bitmapOrg
 */
public static Bitmap compressBitmap(Bitmap bitmapOrg) {
// 加载需要操作的图片,这里是一张图片
// Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.alipay);
// 获取这个图片的宽和高
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
// 定义预转换成的图片的宽度和高度
int newWidth = 360;
int newHeight = 360;
// 计算缩放率,新尺寸除原始尺寸
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 创建操作图片用的matrix对象
Matrix matrix = new Matrix();
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
// 创建新的图片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width,height, matrix, true);
// 将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton中
// BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
return resizedBitmap;
}

/**
 * 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值(效率更高)
 * @param arry
 * @return
 */
public static int changePointPx1(byte[] arry){
int v = 0;
for (int j = 0; j <arry.length; j++) {
if( arry[j] == 1) {
v = v 
------解决思路----------------------
 1 << j;
}
}
return v;
}

/**
 * 将[1,0,0,1,0,0,0,1]这样的二进制转为化十进制的数值
 * @param arry
 * @return
 */
public byte changePointPx(byte[] arry){
byte v = 0;
for (int i = 0; i < 8; i++) {
v += v + arry[i];
}
return v;
}

/**
 * 得到位图的某个点的像素值
 * @param bitmap
 * @return
 */
public byte[] getPicPx(Bitmap bitmap){
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];// 保存所有的像素的数组,图片宽×高
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int i = 0; i < pixels.length; i++) {
int clr = pixels[i];
int red = (clr & 0x00ff0000) >> 16; // 取高两位
int green = (clr & 0x0000ff00) >> 8; // 取中两位
int blue = clr & 0x000000ff; // 取低两位
System.out.println("r=" + red + ",g=" + green + ",b=" + blue);
}
return null;
}

}
  相关解决方案