Android 实现系统打印机打印图片,文本,以及二维码生成与解析

本文介绍如何在Android和Java中生成二维码并将其打印,包括使用系统打印服务打印图片,生成带水印的二维码图片,以及在Java中集成Zxing库生成和解析二维码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

打码机:扫码,生成打印自定义标签  

 一、Android

打印机要支持,网络、WiFi ;手机与打印机在同一网络下才行,本文用WiFi连接 

打开系统打印服务: 设置--更多设置--打印--选择默认打印服务(或者应用商城下载 Mopria Print Service  )--开启

 

1、使用系统打印机打印图片:

    /**系统打印机--打印图片*/
    private void doPrintPictures(Bitmap bitmap) {
        PrintHelper photoPrinter = new PrintHelper(this);
        photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
//        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids);              //本地图片
        photoPrinter.printBitmap("droids.jpg - test print", bitmap);
    }

2、打印自定义标签

将需要打印的内容,图片,文字 通过水印方式添加入一张图片中,再调用系统打印服务,打印出来

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1111) {
            if (data != null) {

                content = data.getStringExtra(Constant.CODED_CONTENT);
                Log.i("扫描结果为:", content);

                scanFragment.onActivityResult(requestCode, resultCode, data);

                //生成的二维码
                Bitmap bitmap = CodeCreator.createQRCode(content, 300, 300, null);

                if (bitmap != null) {
                    //将内容水印方式生成一张图片
                    Bitmap waterMark = AddWatermark(bitmap);
                    contentIv.setImageBitmap(waterMark);
                    //保存入本地
                    QRCodeUtil.saveImageToGallery(getApplicationContext(), waterMark);
                    //打印 图片
                    doPrintPictures(waterMark);

                }
            }
        }
    }

 3、AddWatermark

    /**
     * 添加水印
     *
     * @param mBitmap
     * @return mNewBitmap
     */
    private Bitmap AddWatermark(Bitmap mBitmap) {
        //获取原始图片与水印图片的宽与高
        int mBitmapWidth = mBitmap.getWidth();
        int mBitmapHeight = mBitmap.getHeight();
        //定义底片 大小
        Bitmap mNewBitmap = Bitmap.createBitmap(800, 600, Bitmap.Config.ARGB_8888);
        //原始图片--底片
        Canvas mCanvas = new Canvas(mNewBitmap);
        //向位图中开始画入MBitmap图片 二维码在底片中的位置
//        mCanvas.drawBitmap(mBitmap,0,0,null);
        mCanvas.drawBitmap(mBitmap, 80, 150, null);
        //添加文字
        Paint mPaint = new Paint();
        mPaint.setColor(Color.BLACK);
        mPaint.setTextSize(25);
        //true为粗体,false为非粗体
        mPaint.setFakeBoldText(true);


        //字体
        String mTitl = "Title";
        String mNam = "Name";
        String mP = "P:1234567";
        String mT = "T:2020061916";
        String mV = "V:23563";
        String mS = "S:1025698736125";
        String mMdae = "MADE  IN  CHINA";

        //根据底片大小--->水印的位置坐标
        mCanvas.drawText(mTitl, 80, 130, mPaint);
        mCanvas.drawText(mNam, 400, 130, mPaint);
        mCanvas.drawText(mP, 400, (mBitmapHeight / 4) + 150, mPaint);
        mCanvas.drawText(mT, 400, (mBitmapHeight / 3) + 170, mPaint);
        mCanvas.drawText(mV, 400, (mBitmapHeight / 2) + 160, mPaint);
        mCanvas.drawText(mS, 400, (mBitmapHeight / 1) + 150, mPaint);
        mCanvas.drawText(mMdae, 100, 480, mPaint);
        mCanvas.save();
        mCanvas.restore();

        return mNewBitmap;
    }

4、系统打印:doPrintPictures

   /**
     * 系统打印机--打印图片
     */
    private void doPrintPictures(Bitmap bitmap) {
        PrintHelper photoPrinter = new PrintHelper(this);
        photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
//        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids);              //本地图片
        photoPrinter.printBitmap("droids.jpg - test print", bitmap);
    }

5、保存图片

    /**
     * 将二维码图片保存到文件夹
     *
     * @param context
     * @param bmp
     */
    public static void saveImageToGallery(Context context, Bitmap bmp) {
        // 首先保存图片
        String externalStorageState = Environment.getExternalStorageState();
        //判断sd卡是否挂载
        if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
            /*外部存储可用,则保存到外部存储*/
            //创建一个文件夹
            File appDir = new File(Environment.getExternalStorageDirectory(), "Pictures");
            //如果文件夹不存在
            if (!appDir.exists()) {
                //则创建这个文件夹
                appDir.mkdir();
            }
            //将bitmap保存
            saveImage(context, bmp, appDir);
        } else {
            //外部不可用,将图片保存到内部存储中,获取内部存储文件目录
            File filesDir = context.getFilesDir();
            //保存
            saveImage(context, bmp, filesDir);
        }
    }

    private static void saveImage(Context context, Bitmap bmp, File appDir) {
        //命名文件名称
//          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// HH:mm:ss
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(System.currentTimeMillis());
        String format = dateFormat.format(date);

        String fileName = format + ".jpg";
//        String fileName = "扫码知内容" + ".jpg";
        //创建图片文件,传入文件夹和文件名
        File imagePath = new File(appDir, fileName);
        try {
            //创建文件输出流,传入图片文件,用于输入bitmap
            FileOutputStream fos = new FileOutputStream(imagePath);
            //将bitmap压缩成png,并保存到相应的文件夹中
            bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
            //冲刷流
            fos.flush();
            //关闭流
            fos.close();

            Toast.makeText(context,"保存完毕",Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(),
                    imagePath.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));
    }

 6、关于二维码的生成参考文章:

Android超方便 集成 Zxing实现扫一扫,闪光灯,生成二维码图片,解析二维码(条码)等功能

二、Java

创建Maven项目  pom.xml中依赖 zxing得到 jar,添加入lib中  

附上lib下载地址:lib

附上Maven官网:ZXing Core

    	
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
		<dependency>
		    <groupId>com.google.zxing</groupId>
		    <artifactId>core</artifactId>
		    <version>3.3.0</version>
		</dependency>
    	<dependency>
        	<groupId>com.google.zxing</groupId>
        	<artifactId>javase</artifactId>
        	<version>3.3.0</version>
    	</dependency>

1、生成二维码工具类

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 
public class QRCodeUtil {
	private static final String CHARSET = "utf-8";
	private static final String FORMAT_NAME = "JPG";
	// 二维码尺寸
	private static final int QRCODE_SIZE = 200;
	//嵌入的logo宽度
	private static final int WIDTH = 60;
	//嵌入的 logo高度
	private static final int HEIGHT = 60;
 
	
	/** 
	 * 创建二维码图片
     * @param content  包含的内容
     * @param logo     嵌入的logo
     * @param compress  true or false
	 * @throws Exception 
     */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static BufferedImage createImage(String content, String logo, boolean compress) throws Exception {
		
		 Hashtable hashtable = new Hashtable();
		 hashtable.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		 hashtable.put(EncodeHintType.CHARACTER_SET, CHARSET);
		 hashtable.put(EncodeHintType.MARGIN, 1);
		
		BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hashtable);
		int width = bitMatrix.getWidth();
		int height = bitMatrix.getHeight();
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		
		for (int x = 0; x < width; x++) {
			for (int y = 0; y < height; y++) {
				image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
			}
		}
		if (logo == null || "".equals(logo)) {
			return image;
		}
		// 插入图片
		QRCodeUtil.insertImage(image, logo, compress);
		return image;
	}
 
	private static void insertImage(BufferedImage source, String logo, boolean compress) throws Exception {
		File file = new File(logo);
		if (!file.exists()) {
			System.err.println("" + logo + "   该文件不存在!");
			return;
		}
		Image src = ImageIO.read(file);
		int width = src.getWidth(null);
		int height = src.getHeight(null);
		// 压缩LOGO
		if (compress) { 
			if (width > WIDTH) {
				width = WIDTH;
			}
			if (height > HEIGHT) {
				height = HEIGHT;
			}
			Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
			BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			Graphics g = tag.getGraphics();
			g.drawImage(image, 0, 0, null); // 绘制缩小后的图
			g.dispose();
			src = image;
		}
		// 插入logo
		Graphics2D graphics2d = source.createGraphics();
		int x = (QRCODE_SIZE - width) / 2;
		int y = (QRCODE_SIZE - height) / 2;
		
		graphics2d.drawImage(src, x, y, width, height, null);
		Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
		graphics2d.setStroke(new BasicStroke(3f));
		graphics2d.draw(shape);
		graphics2d.dispose();
	}
 
	/** 
	 * 创建二维码图片
     * @param content  包含的内容
     * @param logo     嵌入的logo
     * @param destPath 图片生成后的存储路径
     * @param compress  true or false  压缩
	 * @throws Exception 
     */
	public static void CreateQrCode(String content, String logo, String destPath, boolean compress) throws Exception {
		BufferedImage image = QRCodeUtil.createImage(content, logo, compress);
		mkdirs(destPath);
		ImageIO.write(image, FORMAT_NAME, new File(destPath));
	}
 
	/* 创建文件路径*/
	public static void mkdirs(String destPath) {
		File file = new File(destPath);
		// 当文件夹不存在时,创建文件
		if (!file.exists() && !file.isDirectory()) {
			file.mkdirs();
		}
	}
 
	/** 
	 * 解析二维码包含的内容
     * @param Path 图片的存储路径
     * 	@param	resultStr  返回解析内容		
	 * @throws Exception 
     */	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static String decode(String path) throws Exception {
		
		File file = new File(path);
		BufferedImage image = ImageIO.read(file);
		if (image == null) {
			return null;
		}
		
		BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		
		Hashtable hashtable = new Hashtable();
		hashtable.put(DecodeHintType.CHARACTER_SET, CHARSET);
		
		Result result = new MultiFormatReader().decode(bitmap, hashtable);
		return result.getText().toString();
	}
}

2、调用添加水印 

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import com.demo.QRCodeUtil;
 
public class DrawPic {
	
    //字体
    private  static String mTitl = "Title";
    private  static String mNam = "Name";
    private  static String mP = "P:1234567";
    private  static String mT = "T:2020061916";
    private  static String mV = "V:23563";
    private  static String mS = "S:1025698736125";
    private  static String mMade = "MADE  IN  CHINA";
	
	public static void main(String[] args) throws Exception {
		//创建二维码图片
		createQrCodePic();
		
		//得到图片缓冲区   //INT精确度达到一定,RGB三原色,高度440,宽度590
		BufferedImage bufferimage = new BufferedImage(590,440,BufferedImage.TYPE_INT_RGB);

		//得到它的绘制环境(这张图片的笔) 
		Graphics2D graphics = (Graphics2D) bufferimage.getGraphics();
		//填充一个矩形 左上角坐标(0,0),宽590,高440;填充整张图片  (设置背景)
		graphics.fillRect(0,0,590,440);
		//设置背景颜色 ---此时生成一张59x44的白底图片,再向其中绘制你想要的图片文字
		graphics.setColor(Color.WHITE);  

//		graphics.setColor(Color.WHITE); 		//边框颜色
//		graphics.drawRect(0,0,590-1,440-1); //画边框

		//设置字体:字体、字号、大小 
		graphics.setFont(new Font("宋体",Font.BOLD,18)); 
		//设置字体颜色
		graphics.setColor(Color.BLACK);

		//向图片上写字符串 
		graphics.drawString(mTitl,30,110); 
		graphics.drawString(mNam,350,110); 
		graphics.drawString(mP,250,145); 
		graphics.drawString(mT,250,195); 
		graphics.drawString(mV,250,245); 
		graphics.drawString(mS,250,295); 
		graphics.drawString(mMade,40,340); 
		
		
		// 向图片内印上 二维码图片
		ImageIcon imgIcon = new ImageIcon("D:\\qrCode\\qrcode\\qrcode.jpg");
		Image image = imgIcon.getImage();
		//绘制图片位置
		graphics.drawImage(image, 30, 120, null); 
		
		//保存图片 JPEG表示保存格式
		ImageIO.write(bufferimage,"JPEG",new File("D:\\qrCode\\创建一张白底+二维码水印的.jpg"));
		System.out.println("图片创建成功");
		
	}
	
	//创建二维码图片
	private static void createQrCodePic()  throws Exception{
		// TODO Auto-generated method stub
		// 存放在二维码中的内容
		String text = "This is a QR code";
		// 存放的logo路径
		String logo = "D:/qrCode/qrcode/logo.jpg";
		// 生成的二维码的路径及名称
		String destPath = "D:/qrCode/qrcode/qrcode.jpg";
		//生成二维码  
//		QRCodeUtil.CreateQrCode(text, logo, destPath, true);
		QRCodeUtil.CreateQrCode(text, null, destPath, true);
		
		// 解析二维码
		String str = QRCodeUtil.decode(destPath);
		// 打印出解析出的内容
		System.out.println(str);
	}
}

3、结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值