精华内容
下载资源
问答
  • 二维码加密解密工具——优密 更新版本发布!-附件资源
  • 二维码加密解密工具

    2013-05-23 00:41:54
    可以对信息进行二维码加密,对二维码图片进行解密,很方便
  • 二维码加密解密APP

    2019-03-16 11:48:54
    有了这款APP,写上你希望对方看到的...当然还可以把平时的常用密码,网站等信息生成加密二维码,保存在手机里,用时扫一扫。软件界面简单,操作容易,是所有爱简单的人的首选.支持生成二维码,解密本地二维码,扫描二维码
  • 优密——二维码加解密工具工具是一款强大的二维码加密与解密扫码的手机软件,适用于Android 2.2及以上...优密二维码加密解密工具主要特点: 1、制作包含加密信息的二维码;软件可在手机中直接生成需要的内容的加密二

    优密——二维码加解密工具该工具是一款强大的二维码加密与解密扫码的手机软件,适用于Android 2.2及以上平台。使用本工具可以制作出具有加密信息的二维码,该二维码无法被普通的二维码扫码工具解码其中的内容,可以非常方便的将机密的信息隐藏在二维码中,帮助保护机密信息不被非法的扫码解读!
     
    优密二维码加密解密工具主要特点:
    1、制作包含加密信息的二维码;软件可在手机中直接生成需要的内容的加密二维码,无需借助电脑等设备,该二维码外观与普通二维码无异,并且也可被常见的普通二维码扫码工具扫描识别,但是却无法被解出其中的有效内容,防止私密被解读。
    2、解密扫码带加密信息的二维码;软件可以如一般二维码扫码工具一般解码任何二维码,同时软件本身还具备扫描解码带加密信息的二维码,普通码、加密码统统不在话下,即使是条形码、DM码也可解码,可以说拥有本工具,一切扫码软件都不再需要了,我们通杀一切!
    3、制作的加密二维码可以保存到手机上,供需要的地方使用。软件不但可以生成需要的二维码,还支持将生成的二维码保存到手机中,方便您的后续使用!
    4、支持直接解码已经保存下来的二维码图片或者带有二维码的照片,方便好用,不用开启摄像头,也可以畅快的解开二维码中的信息,方便解码某些无法通过摄像头实时扫码的场合或者解码通过其他途径得到的带有二维码的图片。从此不再需要多部手机,一边放图片,一边摄像头扫码了!

    此版本(v1.1.221.103)更新内容:
    1、新增“二维码库”功能,可以方便的查找、查看所有通过软件生成的二维码;
    2、对加密二维码的数据结构进行了调整优化,现在加密的二维码能够在解码时被自动识别,省却了解码前设定密码的操作,更加方便好用;
    3、新增解码内容复制到剪贴板的功能,可以方便的将二维码解码的内容保存起来;
    4、新增全新的二维码浏览、预览功能,各项解码信息清晰易辨;
    5、修复若干可能导致软件崩溃的BUG,大大增强了稳定性!


    下载地址:http://pan.baidu.com/s/1hqxdXmG

    展开全文
  •  优密——二维码加解密工具工具是一款强大的二维码加密解密扫码的手机软件,适用于Android 2.2及以上平台。使用本工具可以制作出具有加密信息的二维码,该二维码无法被普通的二维码扫码工具解码其中的内容,...

            Lizcst Software Lab第一款Android平台应用软件——优密正式发布!


            下面是软件的简介及功能特色:


            优密——二维码加解密工具该工具是一款强大的二维码加密与解密扫码的手机软件,适用于Android 2.2及以上平台。使用本工具可以制作出具有加密信息的二维码,该二维码无法被普通的二维码扫码工具解码其中的内容,可以非常方便的将机密的信息隐藏在二维码中,帮助保护机密信息不被非法的扫码解读!

     

            优密二维码加密解密工具主要特点:


            1、制作包含加密信息的二维码;软件可在手机中直接生成需要的内容的加密二维码,无需借助电脑等设备,该二维码外观与普通二维码无异,并且也可被常见的普通二维码扫码工具扫描识别,但是却无法被解出其中的有效内容,防止私密被解读。
            2、解密扫码带加密信息的二维码;软件可以如一般二维码扫码工具一般解码任何二维码,同时软件本身还具备扫描解码带加密信息的二维码,普通码、加密码统统不在话下,即使是条形码也可解码,可以说拥有本工具,一切扫码软件都不再需要了,我们通杀一切!
            3、制作的加密二维码可以保存到手机上,供需要的地方使用。软件不但可以生成需要的二维码,还支持将生成的二维码保存到手机中,方便您的后续使用!

            4、支持直接解码已经保存下来的二维码图片或者带有二维码的照片,方便好用,不用开启摄像头,也可以畅快的解开二维码中的信息,方便解码某些无法通过摄像头实时扫码的场合或者解码通过其他途径得到的带有二维码的图片。从此不再需要多部手机,一边放图片,一边摄像头扫码了!


            软件截图:


    [主界面清爽简洁,易于使用!]



    [普通二维码、加密二维码统统都可以制作~]



    [生成的二维码可以保存起来便于传播发布~]



    [还支持对已保存图片的解码解密哦~]



    [当然摄像头实时解密解码也不在话下!]


    下载地址:http://android.crsky.com/soft/71370.html

    展开全文
  • 二维码加密解密源码

    热门讨论 2012-07-14 17:50:35
    二维码加密解密源码,手机可读出信息,生成的图片在workspace里!
  • 二维码(带Logo)加密解密-QRCode方式

    千次阅读 2020-08-25 16:33:14
    二维码加密解密-QRCode 加密工具类 /** * Copyright © 2020wangylCompany. All rights reserved. * * @Title: QRCodeUtil.java * @Prject: MyTestDemo * @Package: qrcode * @Description: TODO * @version...

    二维码加密解密-QRCode

    QRCode生成和解析二维码的流程步骤在代码里面方便理解。

    加密工具类

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: QRCodeUtil.java
     * @Prject: MyTestDemo
     * @Package: qrcode
     * @Description: TODO
     * @version: V1.0  
     */
    
    package qrcode;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.awt.image.RenderedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.imageio.ImageIO;
    
    import com.swetake.util.Qrcode;
    
    import jp.sourceforge.qrcode.QRCodeDecoder;
    import jp.sourceforge.qrcode.data.QRCodeImage;
    
    
    
    public class QRCodeUtil {
    	 //加密:文字信息----------》二维码
    	/**
    	 * 
    	 * @Title: encoderQRCode
    	 * @Description: TODO
    	 * @param content	二维码的内容
    	 * @param imgPath	二维码的生成路径	src/二维码.png
    	 * @param imgType	二维码的图片格式	png
    	 * @param size		二维码的边长(二维码是正方形,所以只需要边长尺寸即可)
    	 * @return: void	由于二维码生成就是二维码直接输出了,可以不用返回值,或者可以添加boolean返回值
    	     
    	     
    	     这里暂时不处理异常,主要生成二维码
    	 
    	 * @throws IOException 
    	 */
    	
    	public void encoderQRCode(String content,String imgPath,String imgType,int size) throws IOException{
    		/**
    		 * API
    		 * 生成图片需要依赖 ImageIO 里面的  write 方法
    		 * ImageIO.write(im, formatName, output)
    		 * im			RenderedImage
    		 * formatName	格式名字
    		 * output		文件类型,所以需要与现有文件
    		 * 
    		 * 
    		 * RenderedImage 是个接口,不能直接new对象,只能通过他的实现类BufferedImage来简历对象
    		 * (ctrl + t  选中RenderedImage,可以看到关系里面有BufferedImage是RenderedImage的一个实现类)
    		 * BufferedImage类型可以代表内存中的一张图片,内存中产生图片以后直接输出到硬盘即可
    		 * 所以现在需要在内存中产生一张图片,由于产生过程相对比较复杂,这里单独创建一个方法qRCodeCommon()来产生img对象
    		 *qRCodeCommon()用来产生图片,返回值必定是BufferedImage类型
    		 *
    		 */
    //		RenderedImage
    //		BufferedImage bufImg = qRCodeCommon(content,imgType,size);//二维码生成版(初始版本)
    		BufferedImage bufImg = qRCodeCommon2(content,imgType,size);//二维码生成版(加logo)
    		File file = new File(imgPath);
    		ImageIO.write(bufImg, imgType, file);
    		
    	}
    
    
    	/**
    	 * 
    	 * @Title: qRCodeCommon
    	 * @Description: TODO	二维码生成版(初始版本)
    	 * @param content	二维码中的隐藏信息类容
    	 * @param imgType	图片的格式		png
    	 * @param size		二维码的尺寸	边长
    	 * @return			返回生成的图片对象
    	 * @return: BufferedImage
    	 
    	 * @throws UnsupportedEncodingException 
    	 */
    	private BufferedImage qRCodeCommon(String content,String imgType,int size) throws UnsupportedEncodingException {
    		//代码顺序调整前,注释未变化--------------------------------------------
    //		BufferedImage bufImg =null;
    //		/**
    //		 * BufferedImage	内存中的图片
    //		 * 正常情况需要对象直接new 就可以,但是bufImg = new BufferedImage()不可以,说明这个class没有无参构造
    //		 * 查看源码,发现没有无参构造但是有有参构造,选择合适的有参构造
    //		 * new BufferedImage(width, height, imageType)
    //		 * width		int		size
    //		 * height		int		size
    //		 * imageType	int		BufferedImage.TYPE_INT_RGB
    //		 * 
    //		 * imageType 这里或者直接写1
    //		 * 美术的三原色是 红、黄、蓝 ,计算机的三原色是 red green blue 简称RGB
    //		 * 
    //		 * 
    //		 */
    //		bufImg = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
    //		//有了图片对象后,在通过图片对象生成一个画板
    //		Graphics2D graphics2d = bufImg.createGraphics();
    //		//设置画板的背景色设置为白色
    //		graphics2d.setBackground(Color.WHITE);
    //		/**
    //		 * graphics2d.clearRect(x, y, width, height);
    //		 * x、y		坐标位置,0,0就是从画板的 左上角 开始
    //		 * width	二维码的边长就是画板的边长
    //		 * height	二维码的边长就是画板的边长
    //		 */
    //		graphics2d.clearRect(0, 0, size, size);//初始化画板
    //		/**
    //		 * 画板的背景色设置好了,画板的大小设置好了,现在开始准备画画了(画二维码)
    //		 */
    //		graphics2d.setColor(Color.BLACK);//设置二维码的颜色:这里设置黑色
    //		/**
    //		 * 剩下的就是开始话二维码
    //		 * 二维码是如何画的?
    //		 * 这里简述方便理解:
    //		 * 		helloworld是需要转换成二维码的隐藏信息,这里将helloworld转换成二位码的像素点
    //		 * 这里具体是将helloworld隐藏信息转换成了boolean数组,转换成了boolean[][]二维数组
    //		 * 二维码可以是一个平面,可以看成是一个二维数组,helloworld转换的过程中,对于在映射的过程中,
    //		 * 某一个点如果满足映射标记为黑色,从而整体生成了一个二维码
    //		 */
    //		/**
    //		 * 这里需要将传进来的字符串转化成一个二位数组boolean[][]
    //		 * 
    //		 * 转换成二位数组的话有需要一个Qrcode对象,这里是作为一个处理器
    //		 * 
    //		 * qrCodeHandler这里是作为一个处理器
    //		 */
    //		Qrcode qrCodeHandler = new Qrcode();
    //		/**
    //		 * 设置二维码的排错率。L/M/Q/H 从小到大
    //		 * L	7%
    //		 * M
    //		 * Q
    //		 * H	30%
    //		 * 
    //		 * 排错率越高,二维码可存储的信息越少,但是对二维码清晰度要求越小(容易扫出来)
    //		 * 
    //		 * 这里设置一个中间值 M
    //		 */
    //		qrCodeHandler.setQrcodeErrorCorrect('M');
    //		/**
    //		 * 二维码可以存放的信息类型 		N
    //		 * N	数字(只能放数字)
    //		 * A	数字+A~Z
    //		 * B	所有
    //		 * (一般都选B)
    //		 */
    //		qrCodeHandler.setQrcodeEncodeMode('B');
    //		/**
    //		 * 二维码的尺寸
    //		 * 取值范围:1~40		数字越大二维码越大
    //		 * 由于我们制定了二维码的尺寸,但是这里的尺寸只能是1~40,所以超出的话会出错
    //		 * 但是如果真的使用40的话,那二维码又太小了
    //		 * 所以这里为了保证这里满足需求(1~40),又能保证后面的不至于二维码太小,这里自定义一个公式:
    //		 * 在满足qrCodeHandler.setQrcodeVersion(size);的情况下,
    //		 * 再将size进行放大满足其他尺寸的需求,所以这部分代码我们要上移,
    //		 * 先定义这里的尺寸,再将放大后的尺寸提供其他位置使用
    //		 */
    //		qrCodeHandler.setQrcodeVersion(size);
    //	
    //==========================================================================================		
    		
    		//代码顺序调整后,注释未变化--------------------------------------------
    		/**
    		 * 剩下的就是开始话二维码
    		 * 二维码是如何画的?
    		 * 这里简述方便理解:
    		 * 		helloworld是需要转换成二维码的隐藏信息,这里将helloworld转换成二位码的像素点
    		 * 这里具体是将helloworld隐藏信息转换成了boolean数组,转换成了boolean[][]二维数组
    		 * 二维码可以是一个平面,可以看成是一个二维数组,helloworld转换的过程中,对于在映射的过程中,
    		 * 某一个点如果满足映射标记为黑色,从而整体生成了一个二维码
    		 */
    		/**
    		 * 这里需要将传进来的字符串转化成一个二位数组boolean[][]
    		 * 
    		 * 转换成二位数组的话有需要一个Qrcode对象,这里是作为一个处理器
    		 * 
    		 * qrCodeHandler这里是作为一个处理器
    		 */
    		Qrcode qrCodeHandler = new Qrcode();
    		/**
    		 * 设置二维码的排错率。L/M/Q/H 从小到大
    		 * L	7%
    		 * M
    		 * Q
    		 * H	30%
    		 * 
    		 * 排错率越高,二维码可存储的信息越少,但是对二维码清晰度要求越小(容易扫出来)
    		 * 
    		 * 这里设置一个中间值 M
    		 */
    		qrCodeHandler.setQrcodeErrorCorrect('M');
    		/**
    		 * 二维码可以存放的信息类型 		N
    		 * N	数字(只能放数字)
    		 * A	数字+A~Z
    		 * B	所有
    		 * (一般都选B)
    		 */
    		qrCodeHandler.setQrcodeEncodeMode('B');
    		/**
    		 * 二维码的尺寸
    		 * 取值范围:1~40		数字越大二维码越大
    		 * 由于我们制定了二维码的尺寸,但是这里的尺寸只能是1~40,所以超出的话会出错
    		 * 但是如果真的使用40的话,那二维码又太小了
    		 * 所以这里为了保证这里满足需求(1~40),又能保证后面的不至于二维码太小,这里自定义一个公式:
    		 * 在满足qrCodeHandler.setQrcodeVersion(size);的情况下,
    		 * 再将size进行放大满足其他尺寸的需求,所以这部分代码我们要上移,
    		 * 先定义这里的尺寸,再将放大后的尺寸提供其他位置使用
    		 */
    		qrCodeHandler.setQrcodeVersion(size);
    		
    		/*
    		 * qrCodeHandler.calQrcode(qrcodeData)
    		 * calQrcode这个方法就可以将我们需要的信息编程boolean[][]
    		 * 但是calQrcode(qrcodeData)的参数qrcodeData是一个字节数组类型
    		 * 所以我们需要将传进来的string转换称byte[]
    		 */
    		byte[] contentBytes = content.getBytes("UTF-8");//将helloworld---->byte[]"helloworld"
    		boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);//获取到了二维码的二位数组
    		
    		//这里将size按照自定义规则放大到imgSize,然后更改后续的变量
    		int imgSize = 67+12*(size-1);
    		
    		
    
    		BufferedImage bufImg =null;
    		/**
    		 * BufferedImage	内存中的图片
    		 * 正常情况需要对象直接new 就可以,但是bufImg = new BufferedImage()不可以,说明这个class没有无参构造
    		 * 查看源码,发现没有无参构造但是有有参构造,选择合适的有参构造
    		 * new BufferedImage(width, height, imageType)
    		 * width		int		size
    		 * height		int		size
    		 * imageType	int		BufferedImage.TYPE_INT_RGB
    		 * 
    		 * imageType 这里或者直接写1
    		 * 美术的三原色是 红、黄、蓝 ,计算机的三原色是 red green blue 简称RGB
    		 * 
    		 * 
    		 */
    		bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
    		//有了图片对象后,在通过图片对象生成一个画板
    		Graphics2D graphics2d = bufImg.createGraphics();
    		//设置画板的背景色设置为白色
    		graphics2d.setBackground(Color.WHITE);
    		/**
    		 * graphics2d.clearRect(x, y, width, height);
    		 * x、y		坐标位置,0,0就是从画板的 左上角 开始
    		 * width	二维码的边长就是画板的边长
    		 * height	二维码的边长就是画板的边长
    		 */
    		graphics2d.clearRect(0, 0, imgSize, imgSize);//初始化画板
    		/**
    		 * 画板的背景色设置好了,画板的大小设置好了,现在开始准备画画了(画二维码)
    		 */
    		graphics2d.setColor(Color.BLACK);//设置二维码的颜色:这里设置黑色
    		/**
    		 * 由于上面已经获取到了二维码的二位数组
    		 * boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);
    		 * 所以现在只需要在画板中将二维数组画出来即可
    		 * 
    		 * 由于是二维数组,这里描绘二维码的时候需要对二维数组经行双循环遍历
    		 * 由于已经生成了boolean[][],已经指明了元素的true和false,所以只需要对其中的元素进行判断
    		 * true进行描黑,false就不管
    		 */
    		int pixoff = 2;//定义一个二维码偏移量,偏移一点避免顶格
    		for (int i = 0; i < codeOut.length; i++) {
    			for (int j = 0; j < codeOut.length; j++) {
    				if (codeOut[i][j]) {//true进行描黑,false就不管
    					/**
    					 * graphics2d.fillRect(x, y, width, height);
    					 * fillRect		填充长方形
    					 * x\y		坐标(这里i是横坐标,j是纵坐标)
    					 * 			由于x/y只是作标,代表的是一个点,所以一般使用x*3和y*3
    					 * x*3和y*3	表示的是这个以x/y作标为起点的一个3*3的正方形
    					 * width	3
    					 * height	3
    					 * 
    					 * 由于二维码的一般是居中,所以这里需要整体给一个偏移量
    					 * 所以需要提前在循环外面定义一个像素偏移量
    					 * 
    					 * 所以这里需要将定义好的偏移量加载坐标轴里面
    					 */
    					graphics2d.fillRect(i*3+pixoff, j*3+pixoff, 3, 3);
    				}
    			}
    		}
    		//操作完毕后需要释放画板空间
    		graphics2d.dispose();
    		//画完以后的话,流操作一般需要close或者flush一下输出出来
    		//清理:管道流操作,
    		/**
    		 * bufImg是内存中的图片
    		 * 内存是通过一些管道流,管道流里面的东西有的还没有到内存中
    		 * 有时需要强制操作将管道流里面的东西压出来(到硬盘或者内存),这个操作就是flush
    		 * close也可以起到一样的效果
    		 */
    		bufImg.flush();//清理:
    		
    		
    		
    		
    		
    		
    		
    		return bufImg; 
    	}
    	
    	
    	
    	/**
    	 * 
    	 * @Title: qRCodeCommon
    	 * @Description: TODO	二维码生成版(加logo版)
    	 * @param content	二维码中的隐藏信息类容
    	 * @param imgType	图片的格式		png
    	 * @param size		二维码的尺寸	边长
    	 * @return			返回生成的图片对象
    	 * @return: BufferedImage
    	 
    	 * @throws IOException 
    	 */
    	private BufferedImage qRCodeCommon2(String content,String imgType,int size) throws IOException {
    		//代码顺序调整前,注释未变化--------------------------------------------
    //		BufferedImage bufImg =null;
    //		/**
    //		 * BufferedImage	内存中的图片
    //		 * 正常情况需要对象直接new 就可以,但是bufImg = new BufferedImage()不可以,说明这个class没有无参构造
    //		 * 查看源码,发现没有无参构造但是有有参构造,选择合适的有参构造
    //		 * new BufferedImage(width, height, imageType)
    //		 * width		int		size
    //		 * height		int		size
    //		 * imageType	int		BufferedImage.TYPE_INT_RGB
    //		 * 
    //		 * imageType 这里或者直接写1
    //		 * 美术的三原色是 红、黄、蓝 ,计算机的三原色是 red green blue 简称RGB
    //		 * 
    //		 * 
    //		 */
    //		bufImg = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
    //		//有了图片对象后,在通过图片对象生成一个画板
    //		Graphics2D graphics2d = bufImg.createGraphics();
    //		//设置画板的背景色设置为白色
    //		graphics2d.setBackground(Color.WHITE);
    //		/**
    //		 * graphics2d.clearRect(x, y, width, height);
    //		 * x、y		坐标位置,0,0就是从画板的 左上角 开始
    //		 * width	二维码的边长就是画板的边长
    //		 * height	二维码的边长就是画板的边长
    //		 */
    //		graphics2d.clearRect(0, 0, size, size);//初始化画板
    //		/**
    //		 * 画板的背景色设置好了,画板的大小设置好了,现在开始准备画画了(画二维码)
    //		 */
    //		graphics2d.setColor(Color.BLACK);//设置二维码的颜色:这里设置黑色
    //		/**
    //		 * 剩下的就是开始话二维码
    //		 * 二维码是如何画的?
    //		 * 这里简述方便理解:
    //		 * 		helloworld是需要转换成二维码的隐藏信息,这里将helloworld转换成二位码的像素点
    //		 * 这里具体是将helloworld隐藏信息转换成了boolean数组,转换成了boolean[][]二维数组
    //		 * 二维码可以是一个平面,可以看成是一个二维数组,helloworld转换的过程中,对于在映射的过程中,
    //		 * 某一个点如果满足映射标记为黑色,从而整体生成了一个二维码
    //		 */
    //		/**
    //		 * 这里需要将传进来的字符串转化成一个二位数组boolean[][]
    //		 * 
    //		 * 转换成二位数组的话有需要一个Qrcode对象,这里是作为一个处理器
    //		 * 
    //		 * qrCodeHandler这里是作为一个处理器
    //		 */
    //		Qrcode qrCodeHandler = new Qrcode();
    //		/**
    //		 * 设置二维码的排错率。L/M/Q/H 从小到大
    //		 * L	7%
    //		 * M
    //		 * Q
    //		 * H	30%
    //		 * 
    //		 * 排错率越高,二维码可存储的信息越少,但是对二维码清晰度要求越小(容易扫出来)
    //		 * 
    //		 * 这里设置一个中间值 M
    //		 */
    //		qrCodeHandler.setQrcodeErrorCorrect('M');
    //		/**
    //		 * 二维码可以存放的信息类型 		N
    //		 * N	数字(只能放数字)
    //		 * A	数字+A~Z
    //		 * B	所有
    //		 * (一般都选B)
    //		 */
    //		qrCodeHandler.setQrcodeEncodeMode('B');
    //		/**
    //		 * 二维码的尺寸
    //		 * 取值范围:1~40		数字越大二维码越大
    //		 * 由于我们制定了二维码的尺寸,但是这里的尺寸只能是1~40,所以超出的话会出错
    //		 * 但是如果真的使用40的话,那二维码又太小了
    //		 * 所以这里为了保证这里满足需求(1~40),又能保证后面的不至于二维码太小,这里自定义一个公式:
    //		 * 在满足qrCodeHandler.setQrcodeVersion(size);的情况下,
    //		 * 再将size进行放大满足其他尺寸的需求,所以这部分代码我们要上移,
    //		 * 先定义这里的尺寸,再将放大后的尺寸提供其他位置使用
    //		 */
    //		qrCodeHandler.setQrcodeVersion(size);
    //	
    //==========================================================================================		
    		
    		//代码顺序调整后,注释未变化--------------------------------------------
    		/**
    		 * 剩下的就是开始话二维码
    		 * 二维码是如何画的?
    		 * 这里简述方便理解:
    		 * 		helloworld是需要转换成二维码的隐藏信息,这里将helloworld转换成二位码的像素点
    		 * 这里具体是将helloworld隐藏信息转换成了boolean数组,转换成了boolean[][]二维数组
    		 * 二维码可以是一个平面,可以看成是一个二维数组,helloworld转换的过程中,对于在映射的过程中,
    		 * 某一个点如果满足映射标记为黑色,从而整体生成了一个二维码
    		 */
    		/**
    		 * 这里需要将传进来的字符串转化成一个二位数组boolean[][]
    		 * 
    		 * 转换成二位数组的话有需要一个Qrcode对象,这里是作为一个处理器
    		 * 
    		 * qrCodeHandler这里是作为一个处理器
    		 */
    		Qrcode qrCodeHandler = new Qrcode();
    		/**
    		 * 设置二维码的排错率。L/M/Q/H 从小到大
    		 * L	7%
    		 * M
    		 * Q
    		 * H	30%
    		 * 
    		 * 排错率越高,二维码可存储的信息越少,但是对二维码清晰度要求越小(容易扫出来)
    		 * 
    		 * 这里设置一个中间值 M
    		 */
    		qrCodeHandler.setQrcodeErrorCorrect('M');
    		/**
    		 * 二维码可以存放的信息类型 		N
    		 * N	数字(只能放数字)
    		 * A	数字+A~Z
    		 * B	所有
    		 * (一般都选B)
    		 */
    		qrCodeHandler.setQrcodeEncodeMode('B');
    		/**
    		 * 二维码的尺寸
    		 * 取值范围:1~40		数字越大二维码越大
    		 * 由于我们制定了二维码的尺寸,但是这里的尺寸只能是1~40,所以超出的话会出错
    		 * 但是如果真的使用40的话,那二维码又太小了
    		 * 所以这里为了保证这里满足需求(1~40),又能保证后面的不至于二维码太小,这里自定义一个公式:
    		 * 在满足qrCodeHandler.setQrcodeVersion(size);的情况下,
    		 * 再将size进行放大满足其他尺寸的需求,所以这部分代码我们要上移,
    		 * 先定义这里的尺寸,再将放大后的尺寸提供其他位置使用
    		 */
    		qrCodeHandler.setQrcodeVersion(size);
    		
    		/*
    		 * qrCodeHandler.calQrcode(qrcodeData)
    		 * calQrcode这个方法就可以将我们需要的信息编程boolean[][]
    		 * 但是calQrcode(qrcodeData)的参数qrcodeData是一个字节数组类型
    		 * 所以我们需要将传进来的string转换称byte[]
    		 */
    		byte[] contentBytes = content.getBytes("UTF-8");//将helloworld---->byte[]"helloworld"
    		boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);//获取到了二维码的二位数组
    		
    		//这里将size按照自定义规则放大到imgSize,然后更改后续的变量
    		int imgSize = 67+12*(size-1);
    		
    		
    
    		BufferedImage bufImg =null;
    		/**
    		 * BufferedImage	内存中的图片
    		 * 正常情况需要对象直接new 就可以,但是bufImg = new BufferedImage()不可以,说明这个class没有无参构造
    		 * 查看源码,发现没有无参构造但是有有参构造,选择合适的有参构造
    		 * new BufferedImage(width, height, imageType)
    		 * width		int		size
    		 * height		int		size
    		 * imageType	int		BufferedImage.TYPE_INT_RGB
    		 * 
    		 * imageType 这里或者直接写1
    		 * 美术的三原色是 红、黄、蓝 ,计算机的三原色是 red green blue 简称RGB
    		 * 
    		 * 
    		 */
    		bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
    		//有了图片对象后,在通过图片对象生成一个画板
    		Graphics2D graphics2d = bufImg.createGraphics();
    		//设置画板的背景色设置为白色
    		graphics2d.setBackground(Color.WHITE);
    		/**
    		 * graphics2d.clearRect(x, y, width, height);
    		 * x、y		坐标位置,0,0就是从画板的 左上角 开始
    		 * width	二维码的边长就是画板的边长
    		 * height	二维码的边长就是画板的边长
    		 */
    		graphics2d.clearRect(0, 0, imgSize, imgSize);//初始化画板
    		/**
    		 * 画板的背景色设置好了,画板的大小设置好了,现在开始准备画画了(画二维码)
    		 */
    		graphics2d.setColor(Color.BLACK);//设置二维码的颜色:这里设置黑色
    		/**
    		 * 由于上面已经获取到了二维码的二位数组
    		 * boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);
    		 * 所以现在只需要在画板中将二维数组画出来即可
    		 * 
    		 * 由于是二维数组,这里描绘二维码的时候需要对二维数组经行双循环遍历
    		 * 由于已经生成了boolean[][],已经指明了元素的true和false,所以只需要对其中的元素进行判断
    		 * true进行描黑,false就不管
    		 */
    		int pixoff = 2;//定义一个二维码偏移量,偏移一点避免顶格
    		for (int i = 0; i < codeOut.length; i++) {
    			for (int j = 0; j < codeOut.length; j++) {
    				if (codeOut[j][i]) {//true进行描黑,false就不管
    					/**
    					 * graphics2d.fillRect(x, y, width, height);
    					 * fillRect		填充长方形
    					 * x\y		坐标(这里i是横坐标,j是纵坐标)
    					 * 			由于x/y只是作标,代表的是一个点,所以一般使用x*3和y*3
    					 * x*3和y*3	表示的是这个以x/y作标为起点的一个3*3的正方形
    					 * width	3
    					 * height	3
    					 * 
    					 * 由于二维码的一般是居中,所以这里需要整体给一个偏移量
    					 * 所以需要提前在循环外面定义一个像素偏移量
    					 * 
    					 * 所以这里需要将定义好的偏移量加载坐标轴里面
    					 */
    					graphics2d.fillRect(i*3+pixoff, j*3+pixoff, 3, 3);
    				}
    			}
    		}
    		//增加logo
    		/**
    		 * 增加logo:
    		 * 1.加载硬盘里面的logo图片
    		 * 2.将logo图片添加覆盖到二维码的中心
    		 * 
    		 * 注意:logo选取不可过大,过大可能导致显示不出来或者二维码扫不出来
    		 */
    		//将硬盘里面的logo图片,加载为一个Image对象
    		String logoPath = "src/logo.jpg";
    		Image readLogo = ImageIO.read(new File(logoPath));
    		/*
    		 * 在以生成的二维码图像上画Logo
    		 * graphics2d	画笔
    		 * drawImage(img, x, y, width, height, observer)
    		 * img			img对象 	logo
    		 * x/y			logo图像的坐标位置	imgSize*2/5
    		 * width/height	logo的宽高
    		 * observer		null	这里不用处理,取null
    		 * 
    		 * 将二维码横竖各切4刀均分,logo应该添加在最中间的那一块,现在就是定位logo起始坐标
    		 * 由于logo位于最中央,所以logo的左上角应该位于二维码的2/5处
    		 * 
    		 * 上面已经定义了二维码的尺寸大小	imgSize
    		 * int imgSize = 67+12*(size-1);
    		 * 这里可以直接使用即可
    		 * 
    		 * 那么此时logo的尺寸应该为多大呢?
    		 * 由于这个是将二维码横竖五等分,且logo位于二维码最中间那一块
    		 * 那么logo的边长尺寸即为二维码边长尺寸的1/5
    		 * 
    		 * 由于二维码已经生成,这里可以获取整个二维码宽高的尺寸并取1/5作为logo的宽高
    		 * 
    		 * 
    		 */
    		//取整个二维码宽高的尺寸并取1/5作为logo的宽高
    		int maxHeight = bufImg.getHeight();
    		int maxWidth = bufImg.getWidth();
    		graphics2d.drawImage(readLogo, imgSize*2/5, imgSize*2/5, maxWidth/5,maxHeight/5, null);
    //		graphics2d.drawImage(readLogo, imgSize*3/7, imgSize*3/7, maxWidth/7,maxHeight/7, null);
    		
    		//操作完毕后需要释放画板空间
    		graphics2d.dispose();
    		//画完以后的话,流操作一般需要close或者flush一下输出出来
    		//清理:管道流操作,
    		/**
    		 * bufImg是内存中的图片
    		 * 内存是通过一些管道流,管道流里面的东西有的还没有到内存中
    		 * 有时需要强制操作将管道流里面的东西压出来(到硬盘或者内存),这个操作就是flush
    		 * close也可以起到一样的效果
    		 */
    		bufImg.flush();//清理:
    		
    		
    		return bufImg; 
    	}
    	
    	
    	
    	
    	 //解密:二维码------------>文字信息
    	/**
    	 * 刚才是使用手机可以读出来二维码的信息,现在需要使用代码读取图片的信息
    	 */
    	/**
    	 * 
    	 * @Title: decoderQRCode
    	 * @Description: TODO	二维码解密
    	 * @param imgPath	解密二维码文件路径
    	 * @return
    	 * @return: String
    	 
    	 * @throws IOException 
    	 */
    	public String decoderQRCode(String imgPath) throws IOException{
    		//1.受限获取一个图片对象(解密二维码图片对象)
    		//BufferedImage	内存中的图片,将硬盘中的imgPath图片加载到内存中BufferedImage
    		BufferedImage bufImg = ImageIO.read(new File(imgPath));
    		//解密
    		/**
    		 * decoder	解密对象
    		 */
    		QRCodeDecoder decoder = new QRCodeDecoder();
    		/**
    		 * decode(qrCodeImage)
    		 * 解密函数的参数为qrCodeImage
    		 * 也就是解密的对象必须是qrCodeImage对象
    		 * 所以这里需要先准备qrCodeImage对象
    		 * 
    		 * 但是QRCodeImage是一个接口,并且没有对应的实现类
    		 * 所以这里需要QRCodeImage对象只能创建一个类来实现QRCodeImage接口来创建对象
    		 * 这里需要提前创建一个类对象实现QRCodeImage
    		 * decoder.decode(TwoDimensionalCodeImage)即可
    		 * 
    		 * 但是这里需要解密的是bufImg二维码对象,直接把TwoDimensionalCodeImage对象放进去没有意义
    		 * 
    		 * 那么这里可以在TwoDimensionalCodeImage类里面创建一个BufferedImage对象
    		 * 但是创建的BufferedImage对象没有值,
    		 * 这里可以使用构造方法给TwoDimensionalCodeImage里面的BufferedImage赋值
    		 * 
    		 * 完善好TwoDimensionalCodeImage里面的函数后即可补全decoder.decode(qrCodeImage)
    		 */
    		//将内存中的bufImg转换成实现了QRCodeImage接口的TwoDimensionalCodeImage对象
    		TwoDimensionalCodeImage tdcImage = new TwoDimensionalCodeImage(bufImg);
    		//解密QRCodeImage类型对象,解密的结果是一个字节数组
    		byte[] bytes = decoder.decode(tdcImage);
    		//将字节数组转换成字符串,由于避免出现乱码,这里设定编码格式utf-8
    		String content = new String(bytes, "UTF-8");
    		
    		return content;//将解码完成的字符串返回
    	}
    
    }
    
    

    辅助类

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: TwoDimensionalCodeImage.java
     * @Prject: MyTestDemo
     * @Package: qrcode
     * @Description: TODO
     * @version: V1.0  
     */
    
    package qrcode;
    
    import java.awt.image.BufferedImage;
    
    import jp.sourceforge.qrcode.data.QRCodeImage;
    
    /**
     * @ClassName: TwoDimensionalCodeImage
     * @Description: TODO
     * 
     *
     */
    
    public class  TwoDimensionalCodeImage implements QRCodeImage{
    	
    	
    	/**
    	 * 由于decoder.decode(qrCodeImage)需要的是QRCodeImage
    	 * 
    	 * 但是需要解析的是BufferedImage对象,所以我们需要在类里面创建一个BufferedImage
    	 * 
    	 * 然后通构造器给类里面的BufferedImage对象赋值
    	 */
    	BufferedImage bufImg;//内存中的二维码对象
    	
    	public TwoDimensionalCodeImage(BufferedImage bufImg) {
    		this.bufImg=bufImg;
    	}
    	
    	
    	
    	
    	
    
    	/* (non Javadoc)
    	 * @Title: getWidth
    	 * @Description: TODO
    	 * @return
    	 * @see jp.sourceforge.qrcode.data.QRCodeImage#getWidth()
    	 */
    	@Override
    	public int getWidth() {
    		return bufImg.getWidth();
    	}
    
    	/* (non Javadoc)
    	 * @Title: getHeight
    	 * @Description: TODO
    	 * @return
    	 * @see jp.sourceforge.qrcode.data.QRCodeImage#getHeight()
    	 */
    	@Override
    	public int getHeight() {
    		return bufImg.getHeight();
    	}
    
    	/* (non Javadoc)
    	 * @Title: getPixel		像素点
    			由于是解密,解密需要知道所有的像素点
    			像素点就是获取某一个坐标点的颜色值,由于加密是通过true/false上色的
    	
    	 * @Description: TODO
    	 * @param paramInt1
    	 * @param paramInt2
    	 * @return
    	 * @see jp.sourceforge.qrcode.data.QRCodeImage#getPixel(int, int)
    	 */
    	@Override
    	public int getPixel(int paramInt1, int paramInt2) {
    		return bufImg.getRGB(paramInt1, paramInt2);
    	}
    
    }
    
    

    测试类

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: Test.java
     * @Prject: MyTestDemo
     * @Package: qrcode
     * @Description: TODO
     * @version: V1.0  
     */
    
    package qrcode;
    
    import java.io.IOException;
    
    /**
     * @ClassName: Test
     * @Description: TODO 生成二维码
     * 
     *
     */
    
    public class Test {
    	
    	public static void main(String[] args){
    		//生成二维码
    		/**
    		 * 生成二维码  src/二维码.png
    		 * 文字信息、网址信息:
    		 */
    		String imgPath ="src/二维码.png";//生成二维码的路径文件名
    		String imgPath2 ="src/l2.png";//添加logo路径的文件名
    		//存放字符串
    //		String content = "helloworld";
    		//存放网址,扫描二维码会实现网页的跳转操作
    		String content2 = "http//:www.baidu.com";
    		
    		
    		
    		//生成二维码
    		/**
    		 * 加密:文字信息---------->二维码
    		 */
    		//新建一个二维码生成的工具类对象
    		QRCodeUtil qrCodeUtil = new QRCodeUtil();
    		//调用创建的加密的加密方法,根据参数提示将参数补全
    		/**
    		 * qrCodeUtil.encoderQRCode(content, imgPath, imgType, size);
    		 * 
    		 * size 图片大小,只能输入1~40的整数值
    		 * 这里的size尺寸大小会影响到数据的存储解码,当解码出现问题的时候可能是这个二维码太小
    		 * 需要将其调大一些可以存储更多的信息
    		 */
    		try {
    			qrCodeUtil.encoderQRCode(content2, imgPath, "png", 17);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		/**
    		 * 加密:文字信息---------->二维码
    		 * 解密:二维码------------>文字信息
    		 */
    		try {
    			String imgContent = qrCodeUtil.decoderQRCode(imgPath);
    			System.out.println(imgContent);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    }
    
    

    QRCode存在部分解析不出来的问题。(以上没有对异常进行处理)

    展开全文
  • 二维码(带Logo)加密解密-ZXing方式

    千次阅读 2020-08-25 16:59:58
    二维码加密解密工具类 /** * Copyright © 2020wangylCompany. All rights reserved. * * @Title: ZXingUtil.java * @Prject: MyTestDemo * @Package: zxing * @Description: TODO * @author: wangyl * ...

    二维码(带Logo)加密解密-ZXing方式

    ZXing生成和解析二维码的流程步骤在代码的注解里面。

    二维码的加密解密工具类

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: ZXingUtil.java
     * @Prject: MyTestDemo
     * @Package: zxing
     * @Description: TODO
     * @version: V1.0  
     */
    
    package zxing;
    
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.Binarizer;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Result;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.oned.MultiFormatUPCEANReader;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    import jp.sourceforge.qrcode.util.Color;
    
    /**
     * @ClassName: ZXingUtil
     * @Description: TODO
     * 
     *
     */
    
    public class ZXingUtil {
    	
    	
    	//二维码加密:文字--->二维码(无logo)
    	public static void encodeImg(String imgPath,String format,String content,int width, int height) throws WriterException, IOException{
    		/**
    		 * 需要二维码图片,就需要生成图片
    		 * 生成图片就需要用到ImageIO.write(im, formatName, output)
    		 * 实际编写代码的时候一般是是倒着分析,由于生成图片使用的是
    		 * ImageIO.write(im, formatName, output)
    		 * 那么剩下的就是将里面的参数补齐就可以了
    		 * im			RenderedImage
    		 * formatName	格式名字
    		 * output		文件类型,所以需要与现有文件
    		 * 
    		 * 先对文件的格式进行分析,output是文件类型,整个我们可以通过将二维码文件路径作为参数传递过来获取生成文件
    		 * public void encodeImt(String imgPath)
    		 * String imgPath----->file
    		 * File file = new File(imgPath);
    		 * 
    		 * ImageIO.write(, , file)
    		 * 
    		 * 图片的格式formatName,二维码的图片格式,整个可以通过传参的方式传递进来
    		 * encodeImt(String imgPath,String format)
    		 * ImageIO.write(, format, file)
    		 * 
    		 * 
    		 * im			RenderedImage内存中的一张图片
    		 * 由于RenderedImage是一个接口类型不能直接用不能直接生成RenderedImage对象
    		 * 需要使用RenderedImage的子类辅助,选中RenderedImage 然后ctrl+t查看子类
    		 * 可以找到RenderedImage的子类有BufferedImage
    		 * 所以这里我们可以产生一个RenderedImage对象,所以这里剩下的就是如何产生BufferedImage对象
    		 * 
    		 * BufferedImage img = new BufferedImage(width, height, imageType);
    		 * 
    		 * BufferedImage(width, height, imageType);
    		 * 
    		 * 二维码生成进一步分析:
    		 * 由于二维码生成目前需要的是一个内存中图片对象BufferedImage,然后将内存中的二维码输出到硬盘即可
    		 * 但是内存中中的二维码又是如何生成的?
    		 * 二维码生成是将出传递进来的加密字符串转换成一个boolean[][],然后通过对二位数组循环遍历判断,
    		 * 并对true进行着色标记生成成图片。
    		 * (字符串转换二维数组后,字符串中的某一个字符对应二位数组的某一个点后,就标记为true)
    		 * 那么这里整个boolean值怎么拿,如何判断二维数组中的某一个点是true还是false
    		 * 这里需要一个工具类BitMatrix,这个里面包含了一个boolean[][]
    		 * 
    		 * 二维码生成的核心就是产生一个二维数组,产生二维数组需要BitMatrix,因为里面包含了一个二维数组
    		 * 
    		 * 那么BitMatrix怎么产生呢?
    		 * new MultiFormatWriter().encode(contents, format, width, height)
    		 * 这个可以产生图片需要的BitMatrix对象
    		 * 产生BitMatrix需要将new MultiFormatWriter().encode(, , , )里面的参数补齐
    		 * new MultiFormatWriter().encode(, , , )目的是将文本变成二维数组
    		 * contents		加密的字符串,可以作为参数传进来
    		 * new MultiFormatWriter().encode(content, , , )
    		 * format		解密的类型(条形码、二维码.....)     这个类型和二维码图片类型需要区别开来,不是同一个
    		 * new MultiFormatWriter().encode(contents,BarcodeFormat.QR_CODE , , )
    		 * BarcodeFormat.QR_CODE指的就是二维码
    		 * 
    		 * width/height	这个宽高不太重要可以通过调用时候传参写固定
    		 * new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
    		 * 这样这个BitMatrix对象就产生了
    		 * 
    		 * 但是这里还有一个五个参数的也可以产生BitMatrix对象
    		 * new MultiFormatWriter().encode(contents, format, width, height, hints)
    		 * hints	Map<EncodeHintType, ?> hints;
    		 * 所以这里需要一个Map类型对象,但是这个Map是interface Map<K,V>,由于是一个接口,所以需要使用实现类创建对象
    		 * 这里使用Hashtable<K, V>
    		 * K:EncodeHintType
    		 * V:?		这里?代表的是任意类型,所以使用Object
    		 * Hashtable<EncodeHintType, Object>
    		 * 
    		 * 至于为什么需要这个map,暂时不用管,因为这个代码需要,先提供这个对象先
    		 * Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
    		 * 
    		 * 那么这个具体作用做什么的?
    		 * 这个可以用来粗放一些参数值:编码格式、排错率。。。(用来存放加关于加密的参数)
    		 * hints:加密涉及的参数
    		 * 编码格式:
    		 * 排错率:
    		 * 外边距:
    		 * 
    		 * BitMatrix bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    		 * 这样就可以产生一个BitMatrix对象了,然后就可以开始生成内存中的二维码
    		 * BufferedImage img = new BufferedImage(width, height,imgType);
    		 * imgType	图片类型	BufferedImage.TYPE_INT_RGB	
    		 * 画BufferedImage需要用到BitMatrix,现在BitMatrix已经有了,可以开始画图
    		 * 由于BitMatrix里面包含了一个二维数组,所需需要将二位数组整出来
    		 * 
    		 * 
    		 */
    		
    		
    		//生成二维码文件对象
    		//File file = new File(imgPath);
    		/**
    		 * 内存中的一张图片,
    		 * 此时需要的图片是二维码---(产生的前提)--->boolean[][]--(产生的需要)------>BitMatrix
    		 */
    
    		
    		//产生图片需要的BitMatrix对象是需要用到的
    		/**
    		 * hints:加密涉及的参数
    		 */
    		Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
    		//排错率
    		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    		//编码格式
    		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    		//外边距 margin	外边距就是二维码的黑框和背景白色边框的间距
    		//这个暂时给定1,后面可以检查,大小不合适再调整
    		hints.put(EncodeHintType.MARGIN, 1);
    		
    		//产生图片需要的BitMatrix对象
    		//content:	需要加密的文字
    		//BarcodeFormat.QR_CODE:要解析的类型(二维码)
    		//BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
    		
    		BitMatrix bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    		//下面的两层for循环就类似二维数组
    		for (int x = 0; x < width; x++) {
    			for (int y = 0; y < height; y++) {
    				/**
    				 * img.setRGB(x, y, rgb);//在坐标点指定颜色
    				 * x,y代表坐标点
    				 * rgb代表坐标点颜色
    				 * 那么rgb怎么给定颜色?
    				 * 二维码生成就是将加密字符串解析成二位数组,每个字符在二维数组中都有对应的点
    				 * 每个对应的点都会被标记着色,也就是说需要将每个坐标的位置进行判断
    				 * 如果当前点由字符对应的标记点,那么就着色
    				 * bitMatrix里面就包含了二维数组
    				 * img.setRGB(x, y, (bitMatrix.get(x, y)?black:white));
    				 */
    				img.setRGB(x, y, ( bitMatrix.get(x,y)? Color.BLACK:Color.WHITE ));
    				//img.setRGB(x, y, ( bitMatrix.get(x,y)? 0:16777215 ));//也可以不报错
    				/**
    				 * 补充说明
    				 * img.setRGB(x, y, ( bitMatrix.get(x,y)? Color.BLACK:Color.WHITE ))
    				 * 这里可能报错
    				 * 原因img.setRGB(x, y, rgb)三个参数都为int类型
    				 * 但是bitMatrix.get(x,y)? Color.BLACK:Color.WHITE 结果不是int
    				 * 我们这里需要的Color其实来源于jp.sourceforge.qrcode.util.Color
    				 * 而这个包属于QRCode.jar
    				 * 所以根本原因是缺少QECode.jar
    				 * 
    				 * 或者不想额外操作也可以尝试书写对应值
    				 * Color.BLACK=0
    				 * Color.WHITE=16777215
    				 * img.setRGB(x, y, ( bitMatrix.get(x,y)? 0:16777215 ));//也可以不报错
    				 */
    			}
    		 }
    		
    		//生成二维码文件对象
    		File file = new File(imgPath);
    		
    		ImageIO.write(img, format, file);//format是二维码的图片格式
    	}
    	
    	
    	//二维码加密:文字--->二维码(logo版)
    	public static void encodeLogoImg(String imgPath,String format,String content,int width, int height ,String logoPath) throws WriterException, IOException{
    		/**
    		 * 需要二维码图片,就需要生成图片
    		 * 生成图片就需要用到ImageIO.write(im, formatName, output)
    		 * 实际编写代码的时候一般是是倒着分析,由于生成图片使用的是
    		 * ImageIO.write(im, formatName, output)
    		 * 那么剩下的就是将里面的参数补齐就可以了
    		 * im			RenderedImage
    		 * formatName	格式名字
    		 * output		文件类型,所以需要与现有文件
    		 * 
    		 * 先对文件的格式进行分析,output是文件类型,整个我们可以通过将二维码文件路径作为参数传递过来获取生成文件
    		 * public void encodeImt(String imgPath)
    		 * String imgPath----->file
    		 * File file = new File(imgPath);
    		 * 
    		 * ImageIO.write(, , file)
    		 * 
    		 * 图片的格式formatName,二维码的图片格式,整个可以通过传参的方式传递进来
    		 * encodeImt(String imgPath,String format)
    		 * ImageIO.write(, format, file)
    		 * 
    		 * 
    		 * im			RenderedImage内存中的一张图片
    		 * 由于RenderedImage是一个接口类型不能直接用不能直接生成RenderedImage对象
    		 * 需要使用RenderedImage的子类辅助,选中RenderedImage 然后ctrl+t查看子类
    		 * 可以找到RenderedImage的子类有BufferedImage
    		 * 所以这里我们可以产生一个RenderedImage对象,所以这里剩下的就是如何产生BufferedImage对象
    		 * 
    		 * BufferedImage img = new BufferedImage(width, height, imageType);
    		 * 
    		 * BufferedImage(width, height, imageType);
    		 * 
    		 * 二维码生成进一步分析:
    		 * 由于二维码生成目前需要的是一个内存中图片对象BufferedImage,然后将内存中的二维码输出到硬盘即可
    		 * 但是内存中中的二维码又是如何生成的?
    		 * 二维码生成是将出传递进来的加密字符串转换成一个boolean[][],然后通过对二位数组循环遍历判断,
    		 * 并对true进行着色标记生成成图片。
    		 * (字符串转换二维数组后,字符串中的某一个字符对应二位数组的某一个点后,就标记为true)
    		 * 那么这里整个boolean值怎么拿,如何判断二维数组中的某一个点是true还是false
    		 * 这里需要一个工具类BitMatrix,这个里面包含了一个boolean[][]
    		 * 
    		 * 二维码生成的核心就是产生一个二维数组,产生二维数组需要BitMatrix,因为里面包含了一个二维数组
    		 * 
    		 * 那么BitMatrix怎么产生呢?
    		 * new MultiFormatWriter().encode(contents, format, width, height)
    		 * 这个可以产生图片需要的BitMatrix对象
    		 * 产生BitMatrix需要将new MultiFormatWriter().encode(, , , )里面的参数补齐
    		 * new MultiFormatWriter().encode(, , , )目的是将文本变成二维数组
    		 * contents		加密的字符串,可以作为参数传进来
    		 * new MultiFormatWriter().encode(content, , , )
    		 * format		解密的类型(条形码、二维码.....)     这个类型和二维码图片类型需要区别开来,不是同一个
    		 * new MultiFormatWriter().encode(contents,BarcodeFormat.QR_CODE , , )
    		 * BarcodeFormat.QR_CODE指的就是二维码
    		 * 
    		 * width/height	这个宽高不太重要可以通过调用时候传参写固定
    		 * new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
    		 * 这样这个BitMatrix对象就产生了
    		 * 
    		 * 但是这里还有一个五个参数的也可以产生BitMatrix对象
    		 * new MultiFormatWriter().encode(contents, format, width, height, hints)
    		 * hints	Map<EncodeHintType, ?> hints;
    		 * 所以这里需要一个Map类型对象,但是这个Map是interface Map<K,V>,由于是一个接口,所以需要使用实现类创建对象
    		 * 这里使用Hashtable<K, V>
    		 * K:EncodeHintType
    		 * V:?		这里?代表的是任意类型,所以使用Object
    		 * Hashtable<EncodeHintType, Object>
    		 * 
    		 * 至于为什么需要这个map,暂时不用管,因为这个代码需要,先提供这个对象先
    		 * Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
    		 * 
    		 * 那么这个具体作用做什么的?
    		 * 这个可以用来粗放一些参数值:编码格式、排错率。。。(用来存放加关于加密的参数)
    		 * hints:加密涉及的参数
    		 * 编码格式:
    		 * 排错率:
    		 * 外边距:
    		 * 
    		 * BitMatrix bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    		 * 这样就可以产生一个BitMatrix对象了,然后就可以开始生成内存中的二维码
    		 * BufferedImage img = new BufferedImage(width, height,imgType);
    		 * imgType	图片类型	BufferedImage.TYPE_INT_RGB	
    		 * 画BufferedImage需要用到BitMatrix,现在BitMatrix已经有了,可以开始画图
    		 * 由于BitMatrix里面包含了一个二维数组,所需需要将二位数组整出来
    		 * 
    		 * 
    		 */
    		
    		
    		//生成二维码文件对象
    		//File file = new File(imgPath);
    		/**
    		 * 内存中的一张图片,
    		 * 此时需要的图片是二维码---(产生的前提)--->boolean[][]--(产生的需要)------>BitMatrix
    		 */
    
    		
    		//产生图片需要的BitMatrix对象是需要用到的
    		/**
    		 * hints:加密涉及的参数
    		 */
    		Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
    		//排错率
    		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    		//编码格式
    		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    		//外边距 margin	外边距就是二维码的黑框和背景白色边框的间距
    		//这个暂时给定1,后面可以检查,大小不合适再调整
    		hints.put(EncodeHintType.MARGIN, 1);
    		
    		//产生图片需要的BitMatrix对象
    		//content:	需要加密的文字
    		//BarcodeFormat.QR_CODE:要解析的类型(二维码)
    		//BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
    		
    		BitMatrix bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    		//下面的两层for循环就类似二维数组
    		for (int x = 0; x < width; x++) {
    			for (int y = 0; y < height; y++) {
    				/**
    				 * img.setRGB(x, y, rgb);//在坐标点指定颜色
    				 * x,y代表坐标点
    				 * rgb代表坐标点颜色
    				 * 那么rgb怎么给定颜色?
    				 * 二维码生成就是将加密字符串解析成二位数组,每个字符在二维数组中都有对应的点
    				 * 每个对应的点都会被标记着色,也就是说需要将每个坐标的位置进行判断
    				 * 如果当前点由字符对应的标记点,那么就着色
    				 * bitMatrix里面就包含了二维数组
    				 * img.setRGB(x, y, (bitMatrix.get(x, y)?black:white));
    				 */
    				img.setRGB(x, y, ( bitMatrix.get(x,y)? Color.BLACK:Color.WHITE ));
    				//img.setRGB(x, y, ( bitMatrix.get(x,y)? 0:16777215 ));//也可以不报错
    				/**
    				 * 补充说明
    				 * img.setRGB(x, y, ( bitMatrix.get(x,y)? Color.BLACK:Color.WHITE ))
    				 * 这里可能报错
    				 * 原因img.setRGB(x, y, rgb)三个参数都为int类型
    				 * 但是bitMatrix.get(x,y)? Color.BLACK:Color.WHITE 结果不是int
    				 * 我们这里需要的Color其实来源于jp.sourceforge.qrcode.util.Color
    				 * 而这个包属于QRCode.jar
    				 * 所以根本原因是缺少QECode.jar
    				 * 
    				 * 或者不想额外操作也可以尝试书写对应值
    				 * Color.BLACK=0
    				 * Color.WHITE=16777215
    				 * img.setRGB(x, y, ( bitMatrix.get(x,y)? 0:16777215 ));//也可以不报错
    				 */
    			}
    		 }
    		//-------二维码添加Logo----------------start-------------------
    		/**
    		 * 先画二维码,二维码画完了再画logo 
    		 * 由于Logo复杂点,所以单独写一个类
    		 */
    		img = LogoUtil.logoMatrix(img, logoPath);
    		//-------二维码添加Logo----------------end---------------------
    		//生成二维码文件对象
    		File file = new File(imgPath);
    		
    		ImageIO.write(img, format, file);//format是二维码的图片格式
    	}
    	
    	
    	
    	//二维码解密:二维码--->文字
    	/**
    	 * 
    	 * @Title: decodeImg
    	 * @Description: TODO
    	 * @author: wangyl 
    	 * @param file			解密需要传入解密的二维码文件
    	 * @return
    	 * @return: String		将解密后的字符串返回
    	 
    	 * @throws IOException 
    	 * @throws NotFoundException 
    	 */
    	public static void decodeImg(File file) throws IOException, NotFoundException{
    		/**
    		 * 先判断该文件是否存在,不存在直接返回不执行
    		 */
    		if (!file.exists()) {
    			return ;
    		}
    		
    		/**
    		 * 图片存在---->开始解密
    		 * 先将图片文件读取到内存中
    		 * 最终需要的是new MultiFormatUPCEANReader()对象
    		 * MultiFormatReader formatReader = new MultiFormatReader();
    		 * 因为MultiFormatReader里面有decode方法
    		 * formatReader.decode()
    		 * 这样就可以将图片里面包含的文字解析出来
    		 * formatReader.decode(image)的返回值是Result
    		 * Result result= formatReader.decode(image)是核心的方法
    		 * formatReader.decode(image)参数里面提供图片的话就可以解析出来
    		 * 接下来就看formatReader.decode(image)方法里面的参数需要什么就提供什么
    		 * image是BinaryBitmap类型 的,也就是说decode需要BinaryBitmap类型的对象
    		 * 新建BinaryBitmap对象
    		 * new BinaryBitmap(binarizer)
    		 * 新建BinaryBitmap对象的时候BinaryBitmap有需要一个Binarizer对象
    		 * 继续新建一个Binarizer对象
    		 * 但是由于Binarizer是一个抽象类,不能直接新建对象,只能使用子类HybridBinarizer新建对象
    		 * new HybridBinarizer(source)新建需要source参数
    		 * source是LuminanceSource类型的,所以这里新建一个LuminanceSource类型对象
    		 * LuminanceSource是一个抽象类,不能直接创建对象,需要使用子类创建对象
    		 * 这里使用BufferedImageLuminanceSource子类创建对象
    		 *  new BufferedImageLuminanceSource(image)
    		 *  BufferedImageLuminanceSource创建需要BufferedImage类型的image对象
    		 *  
    		 *  
    		 *  由于我们可以通过二维码文件获取BufferedImage对象
    		 * BufferedImage img = ImageIO.read(file);
    		 * 所以new BufferedImageLuminanceSource(img)直接使用即可
    		 * 
    		 * 
    		 * Result result= formatReader.decode(binaryBitmap);
    		 * formatReader.decode(image, hints)解密还有一个方法
    		 * hints是map类型的
    		 * 这里需要map就提供一个map类型(需要什么提供什么)
    		 * 
    		 */
    		//先将图片文件读取到内存中
    		BufferedImage img = ImageIO.read(file);
    		MultiFormatReader formatReader = new MultiFormatReader();
    		//新建LuminanceSource对象
    		LuminanceSource source = new BufferedImageLuminanceSource(img);
    		//新建Binarizer对象
    		Binarizer binarizer = new HybridBinarizer(source);
    		//新建BinaryBitmap对象
    		BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
    		
    		Map map = new HashMap<>();
    		map.put(EncodeHintType.CHARACTER_SET, "utf-8");
    		Result result= formatReader.decode(binaryBitmap,map);
    		
    		System.out.println("解析结果:"+result.toString());
    				
    //		return null;
    	}
    	
    }
    
    

    二维码Logo添加

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: LogoUtil.java
     * @Prject: MyTestDemo
     * @Package: zxing
     * @Description: TODO
     * @version: V1.0  
     */
    
    package zxing;
    /**
     * @ClassName: LogoUtil
     * @Description: TODO
     * 
     *
     */
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.geom.RoundRectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class LogoUtil {
    
    	/**
    	 * 由于新建一个logo的生成类,所以必然需要考虑方法的参数和返回值
    	 * 
    	 * 传入logo图像+二维码图像-------->带logo的二维码图像
    	 * 
    	 */
    	/**
    	 * 
    	 * @Title: logo
    	 * @Description: TODO
    	 * @author: wangyl 
    	 * @param img			二维码图像用来和logo组合
    	 * @param logoPath		logo路径用来生成对象
    	 * @return
    	 * @return: BufferedImage		带logo的二维码图像
    	 
    	 * @throws IOException 
    	 */
    	public static BufferedImage logoMatrix(BufferedImage matrixImage ,String logoPath) throws IOException{
    		/**
    		 * 在二维码上画logo
    		 * 产生了一个画板,一个二维码画板。这个画板上初始化就有了一个二维码
    		 * 现在要在二维码的画板上画logo
    		 */
    		Graphics2D graphics2d = matrixImage.createGraphics();
    		/**
    		 * 画logo是在内存里面画,传进来的是logo地址
    		 * 内存里面的图片对象是BufferedImage,
    		 * 所以这里等同于需要将String logoPath转换成BufferedImage对象
    		 * 
    		 */
    		BufferedImage logoImg = ImageIO.read(new File(logoPath));//logo已经到内存了
    		/**
    		 * 开始在画板里面画logo
    		 * graphics2d.drawImage(img, x, y, width, height, observer);
    		 * 那么从哪里开始画?
    		 * 左上角的点就是坐标起点
    		 * 将二维码看成横竖切割成5/或者7等分的样子来定位logo左上角的坐标位置
    		 * 也就是需要提前获取二维码的对应做左上角的位置
    		 * img 				logo对象
    		 * x/y				左上角坐标起点		
    		 * width/height		logo的大小(确保logo在二维码在最中间)
    		 * observer			null
    		 * 
    		 */
    		int height = matrixImage.getHeight();
    		int width = matrixImage.getWidth();
    		graphics2d.drawImage(logoImg, width*2/5, height*2/5, width/5, height/5, null);
    		//以上ogo及已经添加上去了
    		
    		/**
    		 * 但是在logo外面还有灰色的边框
    		 * 再外层还有白色的边框
    		 * 产生一个画 白色圆角正方形的画笔
    		 * BasicStroke bs = new BasicStroke(width, cap, join)
    		 * 画笔的参数:
    		 * width 		笔的粗细(白的比灰的粗,白的暂定5,灰的暂定1)
    		 * cap 			笔的样式(圆的还是尖的)	
    		 * join			连接处的样式
    		 * new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);//画笔
    		 */
    		BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);//画笔
    		/**
    		 * 画笔创建好了,但是画笔和画板需要关联起来
    		 * 用哪只笔就需要关联哪只笔,就把画笔放进画板
    		 */
    		graphics2d.setStroke(stroke);
    		/**
    		 * 准备开始画:
    		 * 首先需要确定画的形状:正方形
    		 * 但是这个里面没有正方形,只有长方形
    		 * new RoundRectangle2D.Float(x, y, w, h, arcw, arch)
    		 * x,y			坐标起始位置
    		 * w 			长方形宽
    		 * h			长方形高
    		 * arcw 		笔的样式BasicStroke.CAP_ROUND
    		 * arch			连接处样式BasicStroke.JOIN_ROUND
    		 * 
    		 * x,y,w,h和logo相同
    		 */
    		//创建一个正方形
    		RoundRectangle2D.Float round =new RoundRectangle2D.Float(width*2/5, height*2/5, width/5, height/5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    //		graphics2d.setColor(Color.WHITE);//正方形是白色的
    		graphics2d.setColor(Color.RED);//正方形是白色的
    		//图形准备好了,颜色设置好了,开始画
    		graphics2d.draw(round);
    		
    		
    		
    		//白色的边框已经画完了,现在开始画灰色边框--------------------------------------
    		//同理白色的边框,只是粗细和颜色做下调整
    		BasicStroke stroke2 = new BasicStroke(1,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);//画笔
    		graphics2d.setStroke(stroke2);
    		//由于白色是在带logo二维码上画的,且坐标和logo相同,等同于覆盖了一部分logo边缘
    		//灰色同理,但是灰色的框相对于白色更小一点,所以尺寸略有改动
    		RoundRectangle2D.Float round2 =new RoundRectangle2D.Float(width*2/5+2, height*2/5+2, width/5-4, height/5-4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    //		graphics2d.setColor(Color.GRAY);//正方形边框是灰色的
    		graphics2d.setColor(Color.BLUE);//正方形是白色的
    		/**
    		 * 如果有的颜色没有,但是有需要可以
    		 * Color color = new Color(128, 128, 128);//灰色,可查询更改调整为其他颜色
    		 * graphics2d.setColor(color);//灰色        也是可以的
    		 */
    		graphics2d.draw(round2);
    		
    		//画完所有的以后释放空间
    		graphics2d.dispose();
    		//由于是在内存matrixImage里面画的,画完刷新一下
    		matrixImage.flush();
    		return matrixImage;
    		
    	}
    }
    
    

    测试类

    /**  
     * Copyright © 2020wangylCompany. All rights reserved.
     *
     * @Title: Test.java
     * @Prject: MyTestDemo
     * @Package: zxing
     * @Description: TODO
     * @version: V1.0  
     */
    
    package zxing;
    
    import java.io.File;
    import java.io.IOException;
    
    import com.google.zxing.NotFoundException;
    import com.google.zxing.WriterException;
    
    /**
     * @ClassName: Test
     * @Description: TODO
     * 
     *
     */
    
    public class Test {
    
    	/**
    	 * @Title: main
    	 * @Description: TODO
    	 * @author: wangyl 
    	 * @param args
    	 * @return: void
    	 
    	 * @throws IOException 
    	 * @throws WriterException 
    	 * @throws NotFoundException */
    
    	public static void main(String[] args) throws WriterException, IOException, NotFoundException {
    		/**
    		 * 这里我们使用zxing的方式生成二维码和解码
    		 * 首先我们需要生成二维码
    		 * 生成二维码之前这里需要进行需要先指明二维码文件的生成路径
    		 * 然后准备生成二维码的文本内容
    		 * 并且提前准备好logo的图片路径
    		 */
    		//生成二维码的文件路径
    		String imgPath ="src/zxing二维码.png";
    		//二维码中间的logo路径
    		String logoImg ="src/logo.jpg";
    		//二维码里面显示的类容,如果是网页会自动跳转
    		String content = "http//:www.baidu.com";
    		
    		
    		//二维码解密测试
    		String testPath ="src/test.png";
    		
    		/**
    		 * 二维码加密:文字--->二维码
    		 */
    //		ZXingUtil.encodeImg(imgPath, "png", content, 430, 430);
    		
    		ZXingUtil.encodeLogoImg(imgPath, "png", content, 430, 430,logoImg);
    		
    		/**
    		 * 二维码解密:二维码--->文字
    		 */
    		ZXingUtil.decodeImg(new File(testPath));
    	}
    
    }
    
    

    以上代码使用Eclipse编写

    展开全文
  • 二维码的生成及常用加密解密

    千次阅读 2018-04-20 16:17:00
    二维码的生成使用工具:ZXing.Net 创建项目,并把ZXing.Net安装到项目中 创建二维码: /// <summary> /// 创建二维码 /// </summary> /// <param name="msg">要生成的信息</...
  • 二维码 加密 解密 jar 包 qrcode.jar Qrcode_swetake.jar
  • 帐号密码加密钥,AES加密,利用Zxing生成二维码的一个简单例子
  • false, evaluateQRCode: '', 第五步:生成二维码加密封装函数、使用btoa加密 showQRCode () { let projectNo = btoa(this.realTimeFlow.affairs_info_code) let serviceNo = btoa(this.service_number) let channel...
  • 本人自己实现的一篇论文代码,算法将秘密二维码共享到三个二维码中,因为二维码的错误纠错码,每个被修改后的二维码(3个share)...本文代码为matlab代码,可以用来学习二维码可视加密,以及对二维码纠错码的充分学习。
  • 行业分类-物理装置-一种文件多重加密的二维码电子加密解密管理系统及方法.zip
  • 本实例采用vs2008编写,包含了QRCode生成二维码解密二维码,winform+移动端,程序完整极具参考性,希望能够大家带来帮助。
  • pb9生成二维码信息,完美实现Base64加解密、DES加解密、MD5加解密、AES加解密等功能
  • 用于生成加密二维码解密的跨平台桌面应用程序 该应用程序提供了一种存储文本数据的安全方式,该应用程序的目标是让用户可以选择在显而易见的地方存储有价值的信息(密码、种子等)。 该应用程序使用 ElectronJS ...
  • 自己做的加密解密

    2012-06-05 11:40:20
    自己做的加密解密类,对数据进行简单的加密 希望对大家有帮助。
  • 新车 合格证 二维码 解密

    千次阅读 2020-10-09 10:37:29
    附件下载
  • 电信设备-门禁二维码权限信息的加密解密方法和智能门禁系统.zip
  • Java常见应用——Json,二维码生成,加密解密应用 一.JSON 1.下载json架包,json官网:json.org 2.将Map/JavaBean/String转化成json对象,只需要使用JSONObject的构造方法即可 package com.nike.app.json; import ...
  • 二维码生成并加密

    2013-06-25 09:43:32
    * 二维码生成与解析(包含信息加密解密) * @author wangxianchao datetime 2010-6-10 */ public class barcodeUtil { private static Log LOG = LogFactory.getLog(barcodeUtil.class); private static final int ...
  • 本文要推荐的[ToolFk]是一款程序员经常使用的线上免费...ToolFk还支持BarCode条形码在线生成、QueryList采集器、PHP代码在线运行、PHP混淆、加密解密、Python代码在线运行、JavaScript在线运行、YAML格式化工具...
  • jar包:qrcode.jar,Qrcode_swetake.jar 下载地址: http://download.csdn.net/detail/heyeweiwan/8707117 1生成二维码: public class QRCodeEncoderHandler { /** * 生成二维码(QRCode)图片 * @param content
  • 生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static string QrSaveUrl = "/img/QRcodeFile/"; /// <summary>///生成二维码/// </...
  • 支持各种格式尺寸的二维码图像生成,支持加密解密,可以把中英文信息编译进二维图像内。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,541
精华内容 2,616
关键字:

二维码加密解密工具