`
bluishoul
  • 浏览: 956 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[原创]Java 生成 / 解码 QR码

阅读更多

QR码的使用越来越多,可以在很多地方见着,比如火车票、推广产品上等,以下将介绍如何用Java生成QR码以及解码QR码。

1、涉及开源项目

ZXing :一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。---用来解码QRcode

d-project:Kazuhiko Arase的个人项目(他具体是谁不清楚,日本的),提供丰富的配置参数,非常灵活---用来生成QR code

2、效果图:

生成QR code

 

解码QR code

3、使用d-project生成QRcdoe

    1)将com.d_project.qrcode.jar引入工程

    2)QRcodeAction代码:

 

public void generate(RequestContext rc)
			throws UnsupportedEncodingException, IOException, ServletException {
                //待转数据
		String data = rc.param("data", "http://osctools.net/qr");
                //输出图片类型
                String output = rc.param("output", "image/jpeg");

		int type = rc.param("type", 4);
		if (type < 0 || 10 < type) {
			return;
		}

		int margin = rc.param("margin", 10);
		if (margin < 0 || 32 < margin) {
			return;
		}

		int cellSize = rc.param("size", 4);
		if (cellSize < 1 || 4 < cellSize) {
			return;
		}

		int errorCorrectLevel = 0;

		try {
			errorCorrectLevel = parseErrorCorrectLevel(rc,
					rc.param("error", "H"));
		} catch (Exception e) {
			return;
		}

		com.d_project.qrcode.QRCode qrcode = null;
		try {
			qrcode = getQRCode(data, type, errorCorrectLevel);
		} catch (Exception e) {
			return;
		}

		if ("image/jpeg".equals(output)) {

			BufferedImage image = qrcode.createImage(cellSize, margin);

			rc.response().setContentType("image/jpeg");

			OutputStream out = new BufferedOutputStream(rc.response()
					.getOutputStream());

			try {
				ImageIO.write(image, "jpeg", out);
			} finally {
				out.close();
			}

		} else if ("image/png".equals(output)) {

			BufferedImage image = qrcode.createImage(cellSize, margin);

			rc.response().setContentType("image/png");

			OutputStream out = new BufferedOutputStream(rc.response()
					.getOutputStream());

			try {
				ImageIO.write(image, "png", out);
			} finally {
				out.close();
			}

		} else if ("image/gif".equals(output)) {

			GIFImage image = createGIFImage(qrcode, cellSize, margin);

			rc.response().setContentType("image/gif");

			OutputStream out = new BufferedOutputStream(rc.response()
					.getOutputStream());

			try {
				image.write(out);
			} finally {
				out.close();
			}

		} else {
			return;
		}

	}

	private static int parseErrorCorrectLevel(RequestContext rc, String ecl) {
		if ("L".equals(ecl)) {
			return ErrorCorrectLevel.L;
		} else if ("Q".equals(ecl)) {
			return ErrorCorrectLevel.Q;
		} else if ("M".equals(ecl)) {
			return ErrorCorrectLevel.M;
		} else if ("H".equals(ecl)) {
			return ErrorCorrectLevel.H;
		} else {
			throw rc.error("qr_error_correct_error");
		}

	}


	private static QRCode getQRCode(String text, int typeNumber,
			int errorCorrectLevel) throws IllegalArgumentException {
		if (typeNumber == 0) {
			return QRCode.getMinimumQRCode(text, errorCorrectLevel);
		} else {
			QRCode qr = new QRCode();
			qr.setTypeNumber(typeNumber);
			qr.setErrorCorrectLevel(errorCorrectLevel);
			qr.addData(text);
			qr.make();
			return qr;
		}
	}

	private static GIFImage createGIFImage(QRCode qrcode, int cellSize,
			int margin) throws IOException {

		int imageSize = qrcode.getModuleCount() * cellSize + margin * 2;

		GIFImage image = new GIFImage(imageSize, imageSize);

		for (int y = 0; y < imageSize; y++) {

			for (int x = 0; x < imageSize; x++) {

				if (margin <= x && x < imageSize - margin && margin <= y
						&& y < imageSize - margin) {

					int col = (x - margin) / cellSize;
					int row = (y - margin) / cellSize;

					if (qrcode.isDark(row, col)) {
						image.setPixel(x, y, 0);
					} else {
						image.setPixel(x, y, 1);
					}

				} else {
					image.setPixel(x, y, 1);
				}
			}
		}

		return image;
	}
 

 

    3)前端页面:

 

<script type="text/javascript" src="/js/jquery/jquery.form-2.82.js"></script>

<script type="text/javascript">

	$(document).ready(function(){

				$("#submit").click(function(){

			var url = "/action/qrcode/generate?" + $("#qrcode_form").serialize();

			$(".QRCodeDiv img").attr("src",url+"&"+new Date().getTime());

			$("#gen_url").attr("href",url);

		});

		    	$("#zxing").popover({

    		'title':'条形码处理类库 ZXing',

    		'content':'ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。',

			'placement':'bottom'

    	});

	});

</script>

<div id="mainContent" class="wrapper">

<div class="toolName">在线生成二维码(QR码)-采用<a id="zxing" href="http://www.oschina.net/p/zxing">ZXing</a>与<a href="http://www.d-project.com/">d-project</a><a data-toggle="modal" href="#advice" style="float:right;text-decoration:none;"><span class="badge badge-important"><i class="icon-envelope icon-white"></i> Feedback</span></a></div>

<div class="toolUsing clearfix">

	<div class="toolsTab  clearfix">

	    <ul class="nav nav-tabs">

            <li class="active"><a href="/qr">转QR码</a></li>

            <li ><a href="/qr?type=2">二维码解码</a></li>

	    </ul>

	    <div class="clear"></div>

	</div>

	<form id="qrcode_form" method="post" >

	    	<div class="leftBar">

			<div class="title">URL或其他文本:</div>

			<textarea class="input-xlarge" name="data" onfocus="if(this.value=='http://osctools.net/qr'){this.value='';};this.select();" onblur="(this.value=='')?this.value='http://osctools.net/qr':this.value;">http://osctools.net/qr</textarea>

    	</div>

    	<div class="operateLR">

            <div class="OptDetail span1">

            	<label>输出格式:</label>

                <select name="output" class="span1">

                    <option value="image/gif" selected>GIF</option>

                    <option value="image/jpeg">JPEG</option>

                    <option value="image/png">PNG</option>

                </select>

                <label>纠错级别:</label>

                <select name="error" class="span1">

                    <option value="L" selected>L 7%</option>

                    <option value="M">M 15%</option>

                    <option value="Q">Q 25%</option>

                    <option value="H">H 30%</option>

                </select>

                <label>类型:</label>

        		<select name="type" class="span1">

                    <option value="0">自动</option>

                                        <option value="1">1</option>

                                        <option value="2">2</option>

                                        <option value="3">3</option>

                                        <option value="4">4</option>

                                        <option value="5">5</option>

                                        <option value="6">6</option>

                                        <option value="7">7</option>

                                        <option value="8">8</option>

                                        <option value="9">9</option>

                                        <option value="10">10</option>

                                    </select>

                <label>边缘留白:</label>

    			<select name="margin" class="span1">

                                        <option value="0">0</option>

                                        <option value="1">1</option>

                                        <option value="2">2</option>

                                        <option value="3">3</option>

                                        <option value="4">4</option>

                                        <option value="5">5</option>

                                        <option value="6">6</option>

                                        <option value="7">7</option>

                                        <option value="8">8</option>

                                        <option value="9">9</option>

                                        <option value="10">10</option>

                                        <option value="11">11</option>

                                        <option value="12">12</option>

                                        <option value="13">13</option>

                                        <option value="14">14</option>

                                        <option value="15">15</option>

                                        <option value="16">16</option>

                                        <option value="17">17</option>

                                        <option value="18">18</option>

                                        <option value="19">19</option>

                                        <option value="20">20</option>

                                        <option value="21">21</option>

                                        <option value="22">22</option>

                                        <option value="23">23</option>

                                        <option value="24">24</option>

                                        <option value="25">25</option>

                                        <option value="26">26</option>

                                        <option value="27">27</option>

                                        <option value="28">28</option>

                                        <option value="29">29</option>

                                        <option value="30">30</option>

                                        <option value="31">31</option>

                                        <option value="32">32</option>

                                    </select>

                <label>原胞大小:</label>

    			<select name="size" class="span1">

                                        <option value="1"  >1</option>

                                        <option value="2"  >2</option>

                                        <option value="3"  >3</option>

                                        <option value="4" selected >4</option>

                        			</select>

				<button class="btn btn-small btn-primary" id="submit" onclick="return false;">生成QR码</button>            </div>

    	</div>

    	<div class="rightBar">

						<div class="title">QR码:</div>

            <div class="QRCodeDiv">

				<div class="QRWrapper">

					<a id="gen_url" href="/action/qrcode/generate?size=4" target="_blank"><img src="/action/qrcode/generate?size=4"/></a>

				</div>

			</div>

    	</div>

	    </form>

</div>

</div>
 

 

4、使用ZXing解码QRcode

    1)下载Zxing-2.0.zip

    2)引入zxing-barcode_core.jar与zxing_barcode_j2se.jar到工程

    3)QRcodeAction代码:

 

@PostMethod
	@JSONOutputEnabled
	public void decode(RequestContext rc) throws IOException {
		//存在qrcode的网址
                String url = rc.param("url", "");
                //待解码的qrcdoe图像
                File img = rc.file("qrcode");
		if (StringUtils.isBlank(url) && img == null) {
			throw rc.error("qr_upload_or_url_null");
		}

		List<Result> results = new ArrayList<Result>();
		Config config = new Config();
		Inputs inputs = new Inputs();

		config.setHints(buildHints(config));

		if (StringUtils.isNotBlank(url)) {
			addArgumentToInputs(url, config, inputs);
		}
		if (img != null) {
			inputs.addInput(img.getCanonicalPath());
		}
		while (true) {
			String input = inputs.getNextInput();
			if (input == null) {
				break;
			}
			File inputFile = new File(input);
			if (inputFile.exists()) {
				try {
					Result result = decode(inputFile.toURI(), config,rc);
					results.add(result);
				} catch (IOException e) {
				}
			} else {
				try {
					Result result = decode(new URI(input), config,rc);
					results.add(result);
				} catch (Exception e) {
				}
			}
		}
		rc.print(new Gson().toJson(results));
	}

	private Result decode(URI uri,Config config,RequestContext rc)
			throws IOException {
		Map<DecodeHintType, ?> hints = config.getHints();
		BufferedImage image;
		try {
			image = ImageIO.read(uri.toURL());
		} catch (IllegalArgumentException iae) {
			throw rc.error("qr_resource_not_found");
		}
		if (image == null) {
			throw rc.error("qr_could_not_load_image");
		}
		try {
			LuminanceSource source = new BufferedImageLuminanceSource(image);
			BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
			Result result = new MultiFormatReader().decode(bitmap, hints);
			return result;
		} catch (NotFoundException nfe) {
			throw rc.error("qr_no_barcode_found");
		}
	}

	private static Map<DecodeHintType, ?> buildHints(Config config) {
		Map<DecodeHintType, Object> hints = new EnumMap<DecodeHintType, Object>(
				DecodeHintType.class);
		Collection<BarcodeFormat> vector = new ArrayList<BarcodeFormat>(8);
		vector.add(BarcodeFormat.UPC_A);
		vector.add(BarcodeFormat.UPC_E);
		vector.add(BarcodeFormat.EAN_13);
		vector.add(BarcodeFormat.EAN_8);
		vector.add(BarcodeFormat.RSS_14);
		vector.add(BarcodeFormat.RSS_EXPANDED);
		if (!config.isProductsOnly()) {
			vector.add(BarcodeFormat.CODE_39);
			vector.add(BarcodeFormat.CODE_93);
			vector.add(BarcodeFormat.CODE_128);
			vector.add(BarcodeFormat.ITF);
			vector.add(BarcodeFormat.QR_CODE);
			vector.add(BarcodeFormat.DATA_MATRIX);
			vector.add(BarcodeFormat.AZTEC);
			vector.add(BarcodeFormat.PDF_417);
			vector.add(BarcodeFormat.CODABAR);
			vector.add(BarcodeFormat.MAXICODE);
		}
		hints.put(DecodeHintType.POSSIBLE_FORMATS, vector);
		if (config.isTryHarder()) {
			hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
		}
		if (config.isPureBarcode()) {
			hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
		}
		return hints;
	}

	private static void addArgumentToInputs(String argument, Config config,
			Inputs inputs) throws IOException {
		File inputFile = new File(argument);
		if (inputFile.exists()) {
			inputs.addInput(inputFile.getCanonicalPath());
		} else {
			inputs.addInput(argument);
		}
	}
 

 

  4)前端页面:

 

<script type="text/javascript" src="/js/jquery/jquery.form-2.82.js"></script>

<script type="text/javascript">

	$(document).ready(function(){

				$("#qrcode_form").ajaxForm({

			success:function(json){

				if(json==null)

					return;

				json = eval("("+json+")");

				if(json.msg){

					alert(json.msg);

					return;

				}

				if(json[0])

					$("#result").val(json[0].text);

				else

					$("#result").val("解码失败");

			}

		});

		    	$("#zxing").popover({

    		'title':'条形码处理类库 ZXing',

    		'content':'ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。',

			'placement':'bottom'

    	});

	});

</script>

<div id="mainContent" class="wrapper">

<div class="toolName">在线生成二维码(QR码)-采用<a id="zxing" href="http://www.oschina.net/p/zxing">ZXing</a>与<a href="http://www.d-project.com/">d-project</a><a data-toggle="modal" href="#advice" style="float:right;text-decoration:none;"><span class="badge badge-important"><i class="icon-envelope icon-white"></i> Feedback</span></a></div>

<div class="toolUsing clearfix">

	<div class="toolsTab  clearfix">

	    <ul class="nav nav-tabs">

            <li ><a href="/qr">转QR码</a></li>

            <li class="active"><a href="/qr?type=2">二维码解码</a></li>

	    </ul>

	    <div class="clear"></div>

	</div>

	<form id="qrcode_form" method="post" action="/action/qrcode/decode">

	    	<div class="topBar">

            <div class="title">

				<label class="radio" for="upload_url">图片URL:

					<input checked="checked" name="upload_ctn" id="upload_url" style="margin-right:5px;" type="radio" onchange="if(this.checked){$('input[name=\'url\']').removeAttr('disabled');$('input[name=\'qrcode\']').attr('disabled','disabled')}"/>

				</label>

			</div>

			<input name="url" id="url" style="width:100%;height:40px;margin:0 0 10px 0;" onfocus="if(this.value=='http://www.osctools.net/img/qr.gif'){this.value='';};this.select();" onblur="(this.value=='')?this.value='http://www.osctools.net/img/qr.gif':this.value;" value="http://www.osctools.net/img/qr.gif"/>

            <div class="title">

				<label  class="radio" for="upload_img">上传图片:

					<input style="margin-right:5px;" name="upload_ctn" id="upload_img" type="radio" onchange="if(this.checked){$('input[name=\'qrcode\']').removeAttr('disabled');$('input[name=\'url\']').attr('disabled','disabled')}"/>

				</label>

			</div>

			<input disabled="disabled" name="qrcode" type="file" class="input-file"/>

    		<input class="btn btn-primary" value="解码" type="submit"/>

    	</div>

		<div class="bottomBar">

			<div class="title">解码结果:</div>

			<textarea id="result"></textarea>

        </div>

	    </form>

</div>
</div>
 

 

注意:其中牵涉到的RequestContext类,请点击查看

 

 

分享到:
评论

相关推荐

    java生成/解析二维码两种方式

    Java作为一款流行的编程语言,提供了多种库来处理二维码的生成与解析。这里我们将深入探讨如何利用ZXing(Zebra Crossing)这个开源库在Java中实现这两种功能。 **一、ZXing简介** ZXing,又称“条形码扫描器”,是...

    java zxing二维码、条形码生成与解码

    Java ZXing库,全称“Zebra Crossing”,是一款开源的二维码和条形码处理库,广泛应用于各种数据编码和解码场景。它提供了强大的功能,能够轻松地在Java应用程序中生成和读取二维码和条形码。下面我们将深入探讨如何...

    java实现条形码二维码生成含文字标签信息

    本篇将深入探讨如何使用Java结合ZXing库来生成包含文字标签信息的条形码和二维码。 ZXing,全称为“Zebra Crossing”,是一个开源的、跨平台的条码读取和生成项目。它支持多种条码格式,包括一维条形码(如EAN-13、...

    二维码(QR码)生成与解码源码

    压缩包中的"QRCode"文件可能包含了用各种编程语言(如Python、Java、C#等)编写的二维码生成与解码的源代码。通过阅读和理解这些代码,开发者可以了解如何实现二维码的编码和解码算法,以及如何将这些功能集成到自己...

    qr.rar_java qr_java qrco_qr_qr java_qrcode-cui.j

    在Java中,处理QR码通常涉及到使用像ZXing(Zebra Crossing)这样的开源库,它提供了QR码的读取和生成功能。这类库一般包括解析二进制图像中的QR码、解码编码的数据以及提供API供其他应用程序调用等功能。开发者可以...

    java学习 QR解码的Java实现程序.java 源码

    解码QR码是将图像中的QR码转换回其原始信息的过程。本Java学习资源提供了QR码解码的源代码实现,这对于理解QR码的工作原理以及如何在Java应用中集成二维码读取功能至关重要。 1. **QR码解码库**: Java中常用的QR...

    用java生成二维码图片(dm格式的)

    在这个场景中,我们关注的是如何使用Java生成DM格式的二维码图片,以及如何将其保存到本地文件系统。 首先,我们要了解DM码(Data Matrix)是一种二维条形码格式,它能够存储大量的数据,而且尺寸较小,适合在有限...

    基于matlab的QR码编码和解码函数,需要Java,

    在MATLAB中实现QR码的编码与解码功能,通常需要借助Java的支持,因为MATLAB本身并不内置QR码处理的原生函数。 MATLAB是一款强大的数值计算和数据可视化软件,它提供了调用Java类库的能力,通过Java的开源库如ZXing...

    条码,二维码生成与解码

    这是一款功能强大的.NET条码组件,它支持多种条码类型(如Code 128、QR Code、PDF417等)的生成和解码。使用这个库,开发者可以轻松地在C#、VB.NET或其他.NET兼容的语言中实现条码功能。在本项目中,我们看到它被...

    Java生成物流打印单(条形码,二维码)

    Zxing,全称“ZXing (Zebra Crossing)”,是一个开源的条码解码库,支持多种条形码和二维码格式,如QR Code、Code 128、UPC-A等。在生成物流打印单时,我们可以使用Zxing的编码功能将物流单号或其他数据转化为对应的...

    QR+encode+java.rar_encode_java qr_qr code _qr code JAVA_qr java

    在"QR+encode+java.rar"这个压缩包中,包含了一个关于QR码生成和解码的Java源代码项目。这个项目可能是基于开源的Java QR码库,如ZXing(Zebra Crossing)或其他类似的库。ZXing是一个强大的条码和二维码读写库,...

    生成与识别QR Code

    首先,QRCodeUtils.java文件很可能是包含生成和解码QR码功能的工具类。在Java中,我们可以使用开源库如ZXing(Zebra Crossing)来处理QR码。ZXing提供了多种实用工具,包括对一维条形码和二维条形码(如QR码)的读取...

    java二维码编码解码测试

    在项目“java二维码编码解码测试”中,"qrCode"这个文件名可能代表了生成或解码的二维码图像文件。通过这个项目,你可以对Java使用QRCoder库处理二维码有一个全面的了解和实践经验。 总结来说,QRCoder库为Java...

    基于java的QR解码的实现程序.zip

    2. **图像处理**:解码QR码的第一步是捕获或加载包含二维码的图像。这需要了解Java的`java.awt.image`包,如`BufferedImage`类用于存储和操作图像。同时,可能还需要使用`javax.imageio`包来读取和写入图像文件。 3...

    QR CODE JAVA#版本

    通过Java生成的二维码可以嵌入到网页、APP或其他软件中,用户扫描后可以直达特定页面、下载文件或触发其他操作。此外,还可以通过自定义错误纠正级别和数据容量来优化二维码的性能和耐损性。 7. **注意事项** 在...

    二维码的生成及解码-java-web

    二维码(QR Code)是一种二维条形码,广泛应用于数据交换、信息传递等领域。在Java Web开发中,理解和掌握二维码的生成与解码是相当重要的技能。本项目提供了一个实现二维码生成及解码的实例,方便开发者快速集成到...

    QR解码的Java实现程序.zip

    总的来说,这个"QR解码的Java实现程序.zip"提供了一种从图像中提取和解析QR码信息的方法,对理解QR码解码原理以及在Java环境中实现该功能非常有帮助。通过学习和研究这个程序,开发者可以掌握从图像处理到数据解码的...

    QR码源程序,包含编码跟解码

    本压缩包文件提供了QR码的源代码,这意味着我们可以深入理解其编码和解码过程。源代码是用Java语言编写的,Java是一种广泛使用的面向对象的编程语言,以其跨平台性和强大的类库支持而闻名,非常适合处理数据编码和...

    java实现二维码的生成和解码

    Java作为一款广泛使用的编程语言,提供了丰富的库和工具来实现二维码的生成和解码。本篇文章将深入探讨如何在Java环境下创建和解析二维码。 首先,我们需要引入一个Java库,例如Zxing(又名“ZXing”,意为“条形码...

    Java生成二维码QRcode.jar&&DEMO.rar

    在IT行业中,二维码(Quick Response Code,简称QR码)是一种二维条形码,它能够存储大量的数据,并且可以通过智能手机等设备快速读取。在Java编程环境中,生成二维码是一项常见的需求,例如在移动支付、信息分享、...

Global site tag (gtag.js) - Google Analytics