Code Bye

android pos机打印小票 图片打印

 图片怎么转换为图像点阵数据,求大神!


40分
这个以前做过,就是先将图片二值化(非黑即白),在重绘图片,你需要打印多大的图片,还有你需要知道打印机的打印指令(即每一行打印多少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;
	}

}
顶楼上,赞一个

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android pos机打印小票 图片打印