`

二维码学习(三):使用qrcode生成与解析二维码

阅读更多

这篇使用qrcode生成二维码,代码如下:

package com.wjl.test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;

import com.swetake.util.Qrcode;

/**
 * 使用qrcode生成与解析二维码
 * 两个问题:
 * 1、内容不能太多,若是太多将不能生成二维码
 * 2、没有logo的二维码可以解析,有logo的二维码解析时报错:Give up decoding
 * */
public class CreateQRCodeInqrcode {
	private static final String encode="GB2312";
	public static void main(String[] args) {
		//1、定义qrcode的版本、二维码图片后缀名和内容
		int version = 7;
		
		//png比jpg的两个优点:1、png支持透明 2、png较小
		String format = "png";
		String contents = "使用qccode生成二维码";
		System.out.println("生成二维码内容:"+contents);
		
		//2、定义二维码文件
		String filePath = "D:"+File.separator+"temp"+File.separator+"qccode"+System.currentTimeMillis()+"."+format;
		File QRFile = new File(filePath);
		
		//3、生成二维码
		CreateQRCodeInqrcode qrcode = new CreateQRCodeInqrcode();
		boolean flag = qrcode.createQRCode(contents,version,format,QRFile);
		if(flag){//说明生成二维码成功
			System.out.println("文件路径:"+filePath);
			//4、添加logo
			String logoPath = "D:"+File.separator+"temp"+File.separator+"logo.jpg";
			File logoFile = new File(logoPath);
			//为二维码添加logos(这里有一个问题:若没有LOGO可以正常解析,若有LOGO解析的时候报错:Give up decoding)
			//int resu = qrcode.addLogoQRCode(QRFile, logoFile, format,2);
			
			//5、解析二维码
			String result = qrcode.readQRCode(QRFile);
			System.out.println("解析二维码内容:"+result);
		}
	}
	
	/**
	 * 该方法用来生成二维码
	 * @param contents:二维码内容
	 * @param width:二维码宽度
	 * @param version:版本
	 * @param format:二维码图片后缀名
	 * @param QRFile:二维码图片文件
	 * @return boolean:true-生成成功 false-生成失败
	 * */
	public boolean createQRCode(String contents,int version,String format,File QRFile){
		boolean result = false;
		try{
			Qrcode x = new Qrcode();
			x.setQrcodeErrorCorrect('M');//纠错等级
			x.setQrcodeEncodeMode('B');//N代表数字 A代表z-Z,B代表其他字符
			// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 
			x.setQrcodeVersion(version);
			
			int width = 67+12*(version-1);
			int height = width;
			BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
			Graphics2D gs = bufferedImage.createGraphics();
			gs.setBackground(Color.WHITE);//背景色
			gs.setColor(Color.BLACK);
			gs.clearRect(0, 0, width, height);//清除画板内容
			
			int pixoff = 2;//偏移量(若没有偏移量,可能会导致解析出错)
			//将内容转成字节数
			byte[] data = contents.getBytes(encode);
			if(data.length>0 && data.length<120){
				boolean[][] s = x.calQrcode(data);
				for(int i=0;i<s.length;i++){
					for(int j=0;j<s.length;j++){
						if(s[j][i]){
							//填充画板
							gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
						}
					}
				}
			}
			gs.dispose();
			bufferedImage.flush();
			
			ImageIO.write(bufferedImage, format, QRFile);
			result = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 该方法用来读取二维码内容
	 * @param QRFile:二维码图片文件
	 * @return String:二维码内容 
	 * **/
	public String readQRCode(File QRFile){
		if(!QRFile.exists() || !QRFile.isFile()) return "";
		String result="";
		try{
			BufferedImage bufferedImage2 = ImageIO.read(QRFile);
			QRCodeDecoder codeDecoder = new QRCodeDecoder();
			byte[] re = codeDecoder.decode(new MyQRCodeImage(bufferedImage2));
			result = new String(re,encode);
		}catch(Exception e){
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 给二维码图片添加Logo
	 * @param QRFile:二维码图片文件
	 * @param logoFile:logo文件对象
	 * @param format:添加logo后的二维码文件后缀名
	 * @param logoConfig:logo设置
	 * @param postion:1-右下角 非1-中间
	 * @return int:1-找不到二维码文件或logo文件 2-生成成抛出异常 3-生成成功
	 */
	public int addLogoQRCode(File QRFile,File logoFile,String format,int position) {
		int result = 3;
		try {
			//二维码文件或logo文件不存在或不是文件
			if (!QRFile.exists() || !QRFile.isFile() || !logoFile.exists() || !logoFile.isFile()) {
				return 1;
			}
			
			//读取二维码图片,并构建绘图对象
			BufferedImage image = ImageIO.read(QRFile);
			Graphics2D g = image.createGraphics();

			//读取Logo图片
			BufferedImage logo = ImageIO.read(logoFile);
			//设置logo的大小,此处设置为二维码图片的20%,因为过大会盖掉二维码
			int widthLogo = logo.getWidth(null) > image.getWidth() * 2 / 10 ? (image
					.getWidth() * 2 / 10) : logo.getWidth(null), heightLogo = logo
					.getHeight(null) > image.getHeight() * 2 / 10 ? (image
					.getHeight() * 2 / 10) : logo.getWidth(null);

			// 计算图片放置位置
			int x=0,y=0;
			if(position==1){//logo放在右下角
				x = (image.getWidth() - widthLogo);
				y = (image.getHeight() - heightLogo);
			}else{//logo放在中心
				x = (image.getWidth() - widthLogo) / 2; 
				y =(image.getHeight() - heightLogo) / 2;
			}
			
			// 开始绘制图片
			g.drawImage(logo, x, y, widthLogo, heightLogo, null);
			g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
			g.setStroke(new BasicStroke(2));
			g.drawRect(x, y, widthLogo, heightLogo);

			g.dispose();
			logo.flush();
			image.flush();

			ImageIO.write(image,format,QRFile);
		} catch (Exception e) {
			result = 2;
			e.printStackTrace();
		}
		return result;
	}
		
}

class MyQRCodeImage implements QRCodeImage{

	BufferedImage bufferedImage;
	public MyQRCodeImage(BufferedImage bufferedImage){
		this.bufferedImage = bufferedImage;
	}
	public int getHeight() {
		return bufferedImage.getHeight();
	}

	public int getPixel(int arg0, int arg1) {
		return bufferedImage.getRGB(arg0, arg1);
	}

	public int getWidth() {
		return bufferedImage.getWidth();
	}
}

需要的jar包:

qrcode.jar:用来生成二维码

Qrcode_swetake.jar:用来解析二维码

分享到:
评论

相关推荐

    phpqrcode生成二维码

    6. **解码过程**:虽然 PHP QR Code 主要是用来生成二维码,但通过其他库或服务,可以读取和解析二维码中的信息。 7. **应用场景**:二维码广泛应用于网站链接、电子支付、产品追溯、名片交换、Wi-Fi 密码分享等...

    安卓条码扫描二维码相关-java使用qrCode生成二维码实例中间带logo.zip

    这个压缩包"安卓条码扫描二维码相关-java使用qrCode生成二维码实例中间带logo.zip"提供了使用Java语言生成带有logo的二维码的实例代码。以下是关于这个主题的详细知识点: 1. **二维码基本原理**: 二维码(Quick ...

    QRcode生成、解析二维码项目与所有jar

    1. **QRcode生成**: 生成二维码的过程涉及到编码算法,它将文本信息转换为特定的二进制格式,然后通过矩阵布局显示为可见的图形。常用的库有ZXing(Zebra Crossing),它是一个开源的Java库,支持多种一维和二维...

    Java生成和解析二维码1.2(QRCode)

    本代码为二维码生成和解析的Java实现代码,包括三个类和一个QRCode的jar包(一个jar包用于生成二维码,一个jar包用于读取二维码尤其用于读取的jar包不好下载,所以就一起放进来了,方便大家学习使用),一个生成...

    QrCode生成和解析二维码

    【QrCode生成和解析二维码】是IT领域中关于数据编码和识别的一种技术,主要应用于移动设备、产品标签、广告等场景,便于快速扫描获取信息。QrCode,全称Quick Response Code,即快速响应码,由日本Denso Wave公司于...

    Android代码-java使用qrCode生成二维码实例中间带logo.zip

    - `java使用qrCode生成二维码实例`:可能是一个Java类,包含了实际生成二维码的逻辑,包括编码、设置Logo和生成Bitmap的过程。 通过学习这个实例,开发者可以了解如何在Android应用中集成二维码生成功能,并且掌握...

    QRcode二维码生成控件VB调用QrCode控件即可生成.zip

    1. **添加控件**:首先,你需要在VB环境中添加QRCode生成控件到工具箱。这通常涉及到下载一个支持VB的QRCode控件库,将其安装到系统中,然后在VB的工具箱中就能看到这个控件。 2. **设计界面**:在VB的Form设计器中...

    QRCode 生成、解析二维码 jar 包及源码。.zip

    "lib"目录则很可能包含了与QRCode生成和解析相关的第三方库文件,这些jar包可能包含了处理图像、编码和解码等任务所需的API。例如,常见的库可能有ZXing(Zebra Crossing),这是一个开源的条形码和二维码读写库,...

    java二维码解析 zxing2.2及QRCode实现

    3. 解析二维码:读取二维码图像文件,然后使用对应的解码方法获取隐藏在图像中的数据。 4. 错误处理:处理可能的解码错误,比如图像模糊、二维码格式不正确等问题。 为了确保兼容性和效率,开发者需要根据具体需求...

    C#二维码生成解析器QRCode源码

    本资源提供了使用C#编程语言编写的二维码生成与解析器的源码,这对于理解和学习如何在C#环境下处理二维码具有很高的价值。 首先,C#是一种面向对象的、现代的编程语言,由微软开发,主要应用于Windows平台的开发,...

    qrcode.jar,Qrcode_swetake.jar解析生成二维码jar包以及解析生成代码

    5. 解析二维码:如果需要读取二维码,可以使用库提供的解码函数,从图像中提取数据。 在实际应用中,这两个库可能被用于移动应用开发、网页设计、自动化流程控制等领域。例如,电商网站可能利用它们生成商品二维码...

    QrCode 二维码生成与解析

    本主题将深入探讨“QrCode 二维码生成与解析”,包括如何使用JavaScript生成二维码以及如何利用Java工程解析二维码图片文件。 首先,我们来看二维码生成的过程。在JavaScript环境下,可以借助开源库如`qrcode-...

    QRCode生成,解析二维码

    1. **QRCode生成** - **编码原理**:二维码由黑白相间的模块组成,每个模块代表一个二进制位。根据数据类型和数据量,二维码会自动调整布局以存储信息。 - **编码过程**:编码过程中,我们需要将文本、URL、名片等...

    C#调用QRCode.dll实现二维码的生成解析

    总的来说,使用C#调用QRCode.dll生成和解析二维码需要理解二维码编码原理,正确处理字符编码,以及考虑可能的数据长度限制。在实际应用中,可能还需要结合错误处理、数据安全和用户体验等多个方面进行优化。希望这些...

    C# 生成二维码 QrCode.Net

    使用`QrCodeDecoder`类可以解析二维码图像中的数据。 8. **实际应用**:在移动应用开发、物联网设备标识、电子票务等领域,生成和读取二维码都是常见操作,QrCode.Net提供了方便的接口供开发者使用。 总的来说,...

    二维码生成工具QRCode源代码支持中文(解决解码时中文乱码)

    为了解决这个问题,开发者需要使用能够支持UTF-8编码的二维码生成库,ThoughtWorks.QRCode可能已经考虑到了这一点,确保在生成包含中文的二维码时,能够正确地编码和解码,防止出现乱码。 使用这个QRCode源代码,...

    QRCode生成二维码和解析二维码java

    在Java环境中,生成和解析二维码是通过特定的库或API实现的。本项目提供了一个完整的Eclipse项目,包含编码和解码过程的源代码,并封装在一个jar包中,方便开发者直接使用。 生成二维码主要涉及以下知识点: 1. **...

    qrcode解析二维码

    例如,`html5-qrcode`库可以轻松地在浏览器中读取摄像头的实时画面并解析二维码: ```javascript function readQrcode() { html5QrcodeScanner({ fps: 10, // 摄像头帧率 qrbox: 250, // 识别区域大小 callback...

    qrcode 二维码生成器

    在qrcode生成器中,用户可以自定义二维码的颜色方案,包括前景色、背景色以及定位码色,从而实现个性化设计。 Pyside2,作为Qt库的Python绑定,是这个生成器的关键组件。Qt是一个跨平台的应用程序开发框架,广泛...

    Autojs-二维码生成识别.zip

    4. 显示或保存二维码:你可以将生成的位图显示在屏幕上,或者保存为图片文件。 示例代码可能如下: ```javascript var qr = require('qr'); var data = 'https://www.example.com'; var options = {size: 400, ...

Global site tag (gtag.js) - Google Analytics