【Java】利用Java对网址进行二维码的编码与解码操作

二维码之所以能够封装图片、文件等主要是把图片、文件等URL编码成二维码,用户一扫手机自动访问。

上一次在《【jQuery】使用jquery-qrcode插件把网址转化成二维码,手机扫一扫即可访问》(点击打开链接)使用jquery-qrcode插件配合jquery能够把网址编码成字符串,在网址上显示编码后的二维码,移动设备能够直接扫一扫。

这次将在Java中实现对二维码的编码与解码输出到磁盘上,无需在网页中进行,而且还可以解码,但是步骤比较复杂而已。

Java自身当然没有二维码的编码与解码的功能,需要下载两个插件,也就是额外的jar包,一个用来编码的,把字符串、网址、URL等转化成二维码的com.swetake.util.Qrcode,可以从它的官网下载(点击打开链接),我也为大家上传了一份(点击打开链接),另一个用来解码,把二维码转化成原来的字符串、网址、URL等的jp.sourceforge.qrcode.data.QRCodeImage,这个也可以从它的官网中下载(点击打开链接),我也为大家上传了一份(点击打开链接

编码的com.swetake.util.Qrcode下载之后是一个qrcode_java0.50beta10.tar.gz,最新版的Winrar可以解压,解压之后把里面lib目录下的qrcode.jar取出来,改个名字叫qrcodeencoding.jar,解码的jp.sourceforge.qrcode.data.QRCodeImage下载之后的是一个redir.zip,解压之后同样把里面lib目录下的qrcode.jar取出来,改个名字叫qrcodedecoding.jar。本来这些第三方jar包,无需修改可以扔到Java工程中使用。但是,这两家日本公司,实在是太有缘了,开发的二维码包撞衫了。因此,要改好名字才能放到一起。改成其他名字也行,反正就不能同时叫qrcode,我的编码叫qrcode.jar,译码叫qrcodedecoding.jar,主要是一开始不知道两个jar的名字相同,又引入了编码的com.swetake.util.Qrcode,才没改编码包的名字。

在Eclipse中新建一个java工程,叫什么随意,我的叫qrcode,之后最后手动打开eclipse的工程目录,找到这个文件夹,在里面新建一个lib,把qrcodeencoding.jar与qrcodedecoding.jar放进去,然后在Eclipse中刷新一下这个工程,右键点最下面的一项属性,在Java Build Path中的Libraries选择Add Jars..如果没有拷到工程目录下则选择Add External Jars.添加这两个包:

之后先在src下的package下新建一个QRcode.java,也就是一个class。于是,整个工程目录结构如下所示,此时应该没有test.png,test.png是后来生成的二维码文件:

准备工作写好之后就能够正式写代码。

直接贴上全代码,则一行一行给大家剖析,是怎么做的。

package qrcode;

import java.awt.*;
import java.awt.image.*;
import java.io.*;

import javax.imageio.*;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;

import com.swetake.util.Qrcode;

public class QRcode {
	public static void makeQRcode(String content, String imgPath) {
		Qrcode qrcode = new Qrcode();
		qrcode.setQrcodeErrorCorrect('M');
		qrcode.setQrcodeEncodeMode('B');
		qrcode.setQrcodeVersion(7);
		BufferedImage bufImg = new BufferedImage(325, 325,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D gs = bufImg.createGraphics();
		gs.setBackground(Color.WHITE);
		gs.clearRect(0, 0, 325, 325);
		gs.setColor(Color.BLACK);
		try {
			byte[] contentBytes = content.getBytes("utf-8");
			if (0 < contentBytes.length && contentBytes.length < 120) {
				boolean[][] codeOut = qrcode.calQrcode(contentBytes);
				for (int i = 0; i < codeOut.length; i++) {
					for (int j = 0; j < codeOut.length; j++) {
						if (codeOut[j][i]) {
							gs.fillRect(j * 7 + 5, i * 7 + 5, 7, 7);
						}
					}
				}
			}
			gs.dispose();
			bufImg.flush();
			File imgFile = new File(imgPath);
			//生成为png
			ImageIO.write(bufImg, "png", imgFile);
			System.out.println("生成成功!");

		} catch (Exception e) {
			System.out.println("出错了!");
		}

	}

	public static String decodeQRCode(String imgPath) throws IOException {
		File imageFile = new File(imgPath);
		BufferedImage bufImg = null;
		String decodedData = null;
		bufImg = ImageIO.read(imageFile);
		QRCodeDecoder decoder = new QRCodeDecoder();
		decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
		System.out.println("解析成功!");
		return decodedData;
	}

	public static void main(String args[]) throws IOException {
		String content = "http://www.a.com";
		File directory = new File("");
		String imgPath = directory.getCanonicalPath() + "\\test.png";
		makeQRcode(content, imgPath);
		System.out.println(decodeQRCode(imgPath));
	}

}

class J2SEImage implements QRCodeImage {
	BufferedImage bufImg;

	public J2SEImage(BufferedImage bufImg) {
		this.bufImg = bufImg;
	}

	public int getWidth() {
		return bufImg.getWidth();
	}

	public int getHeight() {
		return bufImg.getHeight();
	}

	public int getPixel(int x, int y) {
		return bufImg.getRGB(x, y);
	}
}

1、首先在头部引入:

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import com.swetake.util.Qrcode;

2、然后写makeQRcode这个类,代码如下:

	//由于这个类中同时有主函数,所以要加上static属性
	/*
	 * @content 要编码的内容
	 * @imgPath 二维码生成的路径
	 */
	//据说上面这种说明类参数注释方法,符合名企标准,╮(╯▽╰)╭你TMD看懂就行了
	public static void makeQRcode(String content, String imgPath) {
		//以下很多是指定动作,不为什么,这个类就要这样写,
		//可以改的部分我会注释
		Qrcode qrcode = new Qrcode();
		//这里是容错率,有L,M,Q三种,L为最小,一般如果你还要在二维码上面加图片,就用Q
		//注意这里必须使用单引号,因为这里是char或者int类型,而不是String类型
		qrcode.setQrcodeErrorCorrect('M');
		qrcode.setQrcodeEncodeMode('B');
		qrcode.setQrcodeVersion(7);
		//新建一个325x325px的图像,这个大小不是说改就改的,有讲究的,与下面gs.fillRect语句相关联
		BufferedImage bufImg = new BufferedImage(325, 325,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D gs = bufImg.createGraphics();
		//图像的背景色是白色
		gs.setBackground(Color.WHITE);
		//这里的325x325必须与上面BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB);对应
		//上面是325x325你这里必须是多少
		gs.clearRect(0, 0, 325, 325);
		//二维码的颜色是黑色
		gs.setColor(Color.BLACK);
		//它丫不抛出,不让编译通过╮(╯▽╰)╭
		try {
			//编码方式为utf-8,现在还写gb2312与gbk那就是作死,都什么年代了,编码也全球化了!
			byte[] contentBytes = content.getBytes("utf-8");
			//可以编码的字符串长度0-120字节,二维码的固定长度来的,别改
			if (0 < contentBytes.length && contentBytes.length < 120) {
				boolean[][] codeOut = qrcode.calQrcode(contentBytes);
				for (int i = 0; i < codeOut.length; i++) {
					for (int j = 0; j < codeOut.length; j++) {
						if (codeOut[j][i]) {
							//这里是每一个点为7x7
							//这个7统一改,如果你要每一个点为6x6,那么这句必须写成gs.fillRect(j * 6 + 5, i * 6 + 5, 6, 6);
							//那个5是边缘的留白,就是这个二维码外面还有一些白色的边框,如果这个数是0,紧贴图片边缘据说会出错
							//设置为0我没试过,只是为了好看留5px的空白
							//每个点为7x7,还有5px的留白,得出图片大小为7*45+5*2=325
							//如果你每个点是6*6,留白3px,那么图片大小就是6*45+3*2=276。
							//也就是上面的BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB);与gs.clearRect(0, 0, 325, 325);自己改好
							//这公式中的45与2是固定的,二维码就是这样,不为什么。
							gs.fillRect(j * 7 + 5, i * 7 + 5, 7, 7);
						}
					}
				}
			}
			gs.dispose();
			bufImg.flush();
			File imgFile = new File(imgPath);
			//生成为png
			ImageIO.write(bufImg, "png", imgFile);
			System.out.println("生成成功!");

		} catch (Exception e) {
			System.out.println("出错了!");
		}

	}

3、然后下面的主函数写入要编码的字符串,比如http://www.a.com这个网址,与保存的图片目录,比如当前工程目录,就能完成二维码的编码工作:

	public static void main(String args[]) throws IOException {
		//要编码的字符串
		String content = "http://www.a.com";
		//取出当前的工程目录,并指明保存文件名为test.png
		File directory = new File("");
		String imgPath = directory.getCanonicalPath() + "\\test.png";
		//执行makeQRcode编码的方法
		makeQRcode(content, imgPath);
	}

主函数需要抛出异常是因为用到了File中的取工程目录函数,它JAVA害怕取不到工程目录会出错

4、下面进行二维码的解码工作,首先在文件头引入

import javax.imageio.*;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;

5、先在文件的最下方完成QRCodeImage这个接口的封装,说白就是要把图片转化成QRCodeImage,它这个jar包才能对其成功解码,所以要对这个接口进行封装,不可以强制类型转换。

class J2SEImage implements QRCodeImage {
	BufferedImage bufImg;

	public J2SEImage(BufferedImage bufImg) {
		this.bufImg = bufImg;
	}

	public int getWidth() {
		return bufImg.getWidth();
	}

	public int getHeight() {
		return bufImg.getHeight();
	}

	public int getPixel(int x, int y) {
		return bufImg.getRGB(x, y);
	}
}

这接口封装起来很简单嘛!就是要取走图片、长宽,各个像素的颜色。

6、把QRCodeImage这个接口的封装成J2SEImage之后,写一个decodeQRCode这个类,代码如下:

<span style="white-space:pre">	</span>public static String decodeQRCode(String imgPath) throws IOException {
		/*
		 * @imageFile 被解码的文件
		 * @BufferedImage 此乃所谓的图片缓冲流
		 * @decodedData 存放解码的内容
		 */
		File imageFile = new File(imgPath);
		BufferedImage bufImg = null;
		String decodedData = null;
		bufImg = ImageIO.read(imageFile);
		QRCodeDecoder decoder = new QRCodeDecoder();
		//封装后直接用decode方法就能完成二维码的解码
		decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
		System.out.println("解析成功!");
		//最后返回解码的内容就OK
		return decodedData;
	}

做完在于主函数中加入一条System.out.println(decodeQRCode(imgPath));,就能够在控制台输出解码的内容,运行一下,可以在工程目录下生成了一个http://www.a.com网址被编码成的二维码图片test.png,这个test.png就不传上来,现在的人就是TMD剑,没事拿手机对二维码乱扫,好奇心杀死猫,我放个扣费网址你就呵呵了,同时控制台输出:

时间: 2024-07-30 04:31:44

【Java】利用Java对网址进行二维码的编码与解码操作的相关文章

java利用zxing生成仿新浪微博二维码

原文:java利用zxing生成仿新浪微博二维码 源代码下载地址:http://www.zuidaima.com/share/1550463729896448.htm 效果图: 说明在readme.txt文件

java利用zxing开源工具生成二维码QRCode

原文:java利用zxing开源工具生成二维码QRCode 源代码下载地址:http://www.zuidaima.com/share/1550463727340544.htm

[JAVA]利用google的barcode4j生成二维码和条形码

1.barcode4j介绍 barcode4j是一款开源的条形码生成库,该库由Java语言编写.能够生成很多种编码的条形码,比如:code-39,code-128等等: 2 .在官方网站上下载http://barcode4j.sourceforge.net/相应的文件 3.支持的二维码.条形码样式有: PNG and SVG versions Barcode type PNG graphic Interleaved 2 of 5 ITF-14 Code 39 Code 128 Codabar U

Java利用zxing创建和读取二维码

一.maven依赖 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/art

使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code)

1.Zint生成二维码 http://sourceforge.net/projects/zint/ [1]从上述站点下载Zint工具 [2]安装Zint工具 [3]使用Zint工具生成二维码,注意选择类型,并输入要生成的文本,此处我输入的是Hello World,Everyone! [4]保存Q-R二维码图像 这样我们的Q-R二维码图像就保存成功了[保存为hello.png]. 2.使用Zxing进行解码 Zxing是大名鼎鼎的条码处理开源项目,提供了多个平台上各种标准条形码的生成与解码工具.

web.py搭建个人网址微信二维码后台开发 -《狗嗨默示录》-

建议在Python2.x版本食用 webapp.py #!/usr/bin/env python # -*- coding:UTF-8 -*- import web import qrcode from PIL import Image import datetime urls = ( '/','Index' # '/images/logo.png','Logo' #可放于静态文件夹static中 ) render = web.template.render('templates')#模板引擎

随便玩玩Django--输入网址生成二维码

在自强学堂上学习了下django,自己花了点时间写个输入网址生成二维码的网页.大概思路:在前端网页输入要转化成二维码的网址,网页提交表单通过urls.py找到views.py相应的方法,生成二维码图片.动手玩玩. 创建项目 django-admin.py startproject lsk_tool 在新建的项目里新建一个app python manage.py startapp tools 在app中新建templates文件夹,把写好的网页文件夹中,index.html代码如下: <!DOCT

Java使用Zxing生成、解析二维码工具类

Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2).二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的; package com.qlwb.business.util; //导入省略... /** * 二维码工具类 * */ public class MatrixToLogoImageWriter { priva

利用Zxing扫描和产生二维码

这段时间我做的一个app需要用到二维码扫描,但是找遍了我们的51CTO都没有找到合适的文章,我想把我自己利用zxing做二维码扫描的方法提供出来供大家参考. 什么是Z?在Android平台做过二维码相关模块的肯定都熟知ZXing开源项目,Z是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括: .NET and C#.J2ME.J2SE和Android等.其GitHub地址是:http