二维码的生成与简析

二维码的生成与简析

二维码定义:

先拓展一下一维条码:  一维条码就是“条码条”和“空白”的排列组合, 一维条码的数据只记载在宽度上,长度上不记载任何数据。

二维码:又称二维条码,是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩阵图案存储记录数据,用设备扫描后可以获取二维码中所包含的信息。

二者区别:二维条码的长度,宽度均记载着数据,而一维条码只有宽度记载数据。

常见的二维条码有:PDF417码、QR码、汉信码、颜色条码、EZ码等。我们日常生活中所常见的二维码时QR码。

 

 

QR码:全称为快速响应矩阵图码(quick response Code),1994年由日本一个公司发明,QR码呈正方形,常见的是黑白两色,也有彩色的。

QR码整体来看是一个回字形的正方形图案,整体来看,三个角落类似“回”字的小图形是定位点,其余详情见图4。

 
          图4 QR码结构图(本图片来自 https://www.cnblogs.com/xxaxx/p/3416450.html
 
QR码有自己独特的容错机制,它可以在损毁7%-30%的面积下仍可以被扫描,我们微信里常见的二维码名片中间的头像,就是利用了QR的容错机制。

java二维码生成处理步骤:

1.首先我们用到的是eclipse集成环境,配置好环境变量后,导入jar包,在生成二维码需要用到两个jar包:core.jar和javase.jar,这两个jar包在GitHub上找到下载并配置即可。

2.创建二维码图片:

(1)首先设置二维码长宽(长宽相等),用BufferedImage类在内存区域处理图片,使用循环,将数据存储的码元设置为黑色,无数据的定义为白色(色彩可对照色码表自行尝试更改)

for(int x = 0;x<w;x++)//创建图片
		{
			for(int y = 0;y<h;y++)
			{
				if(bitMatrix.get(x, y))
				{
					 qr.setRGB(x, y, 0x000000);//有数据设为黑色
				}
				else
				{
					qr.setRGB(x, y, 0xFFFFFF);//无数据设为白色	
					
				}
			}
		}

 (2)设置logo图片,从电脑中读取用作logo的图片,设置其大小,并居中,切记,logo所占面积不能超过二维码总面积的30%,否则生成的二维码无法读取。

(3)生成二维码图片在指定存储区域。

3.扫描生成的二维码图片,读取存储的信息。

下方二维码是我所生成的二维码。后附整个代码段。欢迎大家批评斧正,如有侵权请及时联系。

整体代码:

package Test;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

public class lulu {
	public static void main(String[] args) throws WriterException, IOException
	{
		MultiFormatWriter writer = new MultiFormatWriter();
		String contents = "错位时空";
		int w = 200;
		int h = 200;
		HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType, Object>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//将编码选项放入,编码使用字符集
		BitMatrix bitMatrix = writer.encode(contents, BarcodeFormat.QR_CODE, w, h, hints);
		//创建图片
		BufferedImage qr = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		Graphics graphics=qr.getGraphics();
		for(int x = 0;x<w;x++)//创建图片
		{
			for(int y = 0;y<h;y++)
			{
				if(bitMatrix.get(x, y))
				{
					 qr.setRGB(x, y, 0x000000);//有数据设为黑色
				}
				else
				{
					qr.setRGB(x, y, 0xFFFFFF);//无数据设为白色	
					
				}
			}
		}
		//读取logo
		BufferedImage logoImg = ImageIO.read(new File("f:/3.jpg"));
		int logoW = 30, logoH=30;
		
		Image logoUse = logoImg.getScaledInstance(20, 20, Image.SCALE_FAST);
		//绘制logo
		Graphics g = qr.getGraphics();
		int logoX=(w-logoW)/2;
		int logoY=(h-logoH)/2;
		g.drawImage(logoUse, logoX, logoY, null);
		ImageIO.write(qr, "png", new File("f:/456.png"));
		
	
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值