关于JAVA的笔记(二维码)

生成二维码可以用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就不赘述了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值