二维码的生成与简析
二维码定义:
先拓展一下一维条码: 一维条码就是“条码条”和“空白”的排列组合, 一维条码的数据只记载在宽度上,长度上不记载任何数据。
二维码:又称二维条码,是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩阵图案存储记录数据,用设备扫描后可以获取二维码中所包含的信息。
二者区别:二维条码的长度,宽度均记载着数据,而一维条码只有宽度记载数据。
常见的二维条码有:PDF417码、QR码、汉信码、颜色条码、EZ码等。我们日常生活中所常见的二维码时QR码。



QR码:全称为快速响应矩阵图码(quick response Code),1994年由日本一个公司发明,QR码呈正方形,常见的是黑白两色,也有彩色的。
QR码整体来看是一个回字形的正方形图案,整体来看,三个角落类似“回”字的小图形是定位点,其余详情见图4。

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"));
}
}