生成二维码可以用QRcode或者ZXing来生成
QRcode:
加密:
首先需要路径以及内置信息。内置信息如果为链接 其内部会自动实现跳转功能
//保存路径
//信息
String imgPath="src/二维码.png";
String congtent="helloworld";
绘画的方法
public void encoderQRCode(String content,String imgpath,String imgType,int size)throws Exception {
//API
RenderedImage im=QRCodeCommon(content,size,imgType);
File file=new File(imgpath);
/*ImageIO.write(a, b, c);
* a:图片在内存中的体现形式 RenderedImage
* b:图片格式
* c:导出路径
*
*/
ImageIO.write(im, imgType, file);
}
二维码的绘制信息的原理主要为生成boolean二维数组。二维数组可以体现出图片的XY,而boolean类型的非true即false可以选择填充或者不填充。
/*
* 内置方法
* 需要图片格式
* 隐藏信息
* 边长
*/
public RenderedImage QRCodeCommon(String content, int size, String imgType) {
// TODO Auto-generated method stub
BufferedImage bufImg=null;
//使用QRcode对象
Qrcode qrcodeHander=new Qrcode();
//设置二维码的排错率:7% L、M、Q、H 30% 排错率越高,存储信息越少,对二维码清晰度要求越低
qrcodeHander.setQrcodeEncodeMode('M');
//存放类型 N:数字 A:数字加【A-Z】B:所有
qrcodeHander.setQrcodeEncodeMode('B');
//尺寸 取值范围 1-40
qrcodeHander.setQrcodeVersion(size);
//将字符串生成boolean数组
boolean[][] codeout=qrcodeHander.calQrcode(content.getBytes());
由于有尺寸限制,必须调大尺寸
int imgSize=67+12*(size-1);//放大尺寸
开始绘制图像
/*
* 长宽
* 以及
* 颜色类型
*/
bufImg=new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
Graphics2D gs= bufImg.createGraphics();//生成2D画板
gs.setBackground(Color.white);//生成白色背景
gs.clearRect(0, 0, imgSize, imgSize);//初始化 x y指的是起点原点
gs.setColor(Color.BLACK);//画图像颜色
int pixoff=2;//设置偏移量
将boolean类型二维数组双重遍历填充颜色
for(int i=0;i<codeout.length;i++) {
for(int j=0;j<codeout.length;j++) {
if(codeout[i][j]) {
gs.fillRect(i*3+pixoff, j*3+pixoff, 3, 3); //将对应的标填充为黑色 设置宽高 并判断每个方块起始坐标
}
}
}
gs.dispose();//释放画板
bufImg.flush();//内存刷入
当然也可以在中间加入logo
其思路为读入logo 并重新覆盖在二维码中间部位,比例要把握好否则有可能覆盖内置内容。
解密:
public String decoderQRCode(String imgpath) throws IOException {
BufferedImage bufImage= ImageIO.read(new File(imgpath));
QRCodeDecoder decode=new QRCodeDecoder();
byte[] bs=decode.decode(new QRCodeImage() {
@Override
public int getWidth() {
// TODO Auto-generated method stub
return bufImage.getWidth();
}
@Override
public int getPixel(int arg0, int arg1) {
// TODO Auto-generated method stub
return bufImage.getRGB(arg0, arg1);
}
@Override
public int getHeight() {
// TODO Auto-generated method stub
return bufImage.getHeight();
}
});
String content =new String(bs, "UTF-8");
return content;
}
主要还是使用了内置方法。其中decode方法中的参数可以为直接实现接口 或者自己写多个类来继承。getPixel该方法是获取当前坐标值的RGB值。
ZXing:
使用本类库制作思路大体上跟QRcode一样
首先画图第一步
/*ImageIO.write(a, b, c);
* a:图片在内存中的体现形式 RenderedImage
* b:图片格式
* c:导出路径
*
*/
ImageIO.write(im, imgType, file);
补齐参数
File file=new File(imgpath);
BufferedImage im=new BufferedImage(size,size,BufferedImage.TYPE_INT_BGR);
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
im.setRGB(i, j,(b.get(i, j)? Color.BLACK:Color.WHITE));
}
}
使用zxing制作布尔类型数组(伪)
//MultiFormatWriter.encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints)
BitMatrix b= new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size,hints);
补齐参数。其中MAP的目的是为了设置参数。
HashMap<EncodeHintType, Object> hints=new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.CHARACTER_SET, CharacterSetECI.UTF8);
hints.put(EncodeHintType.MARGIN,2);
由上至下分别为:排错率、字符编码、外圈白圈尺寸。
解密
public static String decoder(String imgpath) throws Exception {
BufferedImage bufimg= ImageIO.read(new File(imgpath));
Binarizer binarizer =new HybridBinarizer(new BufferedImageLuminanceSource(bufimg));
BinaryBitmap bitmap=new BinaryBitmap(binarizer );
Result rs= new MultiFormatReader().decode(bitmap);
return rs.getText();
}
添加logo思路如QRcode就不赘述了