使用 Qrcode 生成中间带 logo 的二维码!

可以自由定义生成的二维码中间是否带 logo !

package com.controller;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

import com.entity.CodeImage;
import com.swetake.util.Qrcode;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

/**
 * @author Mongo
 */
public class QrCode {

	/**
	 * 生成二维码(QRCode)图片
	 *
	 * @param flag (是否带中间logo)
	 */
	public static void createQRCode(Boolean flag) {
		try {

		//================基本信息==============================================

			/* 要合成的两张图片 */
			String logoPath = "D:/logo.png";//中间logo图片
			String qrcodePath = "D:/qrcode.png";//二维码图片

			/* 二维码种要存储的信息!(没有的话,二维码不展示!) */
			String content = "您的设备已经中毒了,请注意!请注意!";

			/* 合成的二维码的一些特性 */
			String format = "png";//图片的格式
			char correct = ‘H‘;// 容错率
			char mode = ‘B‘;// 类型
			int version = 10;// 版本(亦能决定合成后的二维码大小)

			/* 合成后的二维码的宽与高 */
			int width = 178;
			int height = 178;

		//=====================================================================	

			Qrcode qrcodeHandler = new Qrcode();
			/* 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 */
			qrcodeHandler.setQrcodeErrorCorrect(correct);// 特别注意:这里使用单引号!! 属于 char 类型,不是 String 类型
			/* N代表数字,A代表字符a-Z,B代表其他字符 */
			qrcodeHandler.setQrcodeEncodeMode(mode);
			/* 设置设置二维码版本,取值范围1-40,值越大尺寸越大,可存储的信息越大 */
			qrcodeHandler.setQrcodeVersion(version);

			/* 内容 byte 化 */
			byte[] contentBytes = content.getBytes("UTF-8");

			BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

			Graphics2D gs = bufImg.createGraphics();
			gs.setBackground(Color.WHITE);
			gs.clearRect(0, 0, width, height);//没有这个,二维码全黑

			/* 设置图像颜色 */
			gs.setColor(Color.BLACK);

			/* 设置偏移量 不设置可能导致解析出错 */
			int pixoff = 2;//中间logo偏移大小
			/* 输出内容 > 二维码 */
			if (contentBytes.length > 0 && contentBytes.length < width) {
				boolean[][] codeOut = qrcodeHandler.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 * 3 + pixoff, i * 3 + pixoff, 3, 3);
						}
					}
				}
			} else {
				System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,200]. ");
			}

			/* 判断是否需要添加logo图片 */
			if (flag) {
				int width_4 = width / 4;
				int width_8 = width_4 / 2;
				int height_4 = height / 4;
				int height_8 = height_4 / 2;
				Image img = ImageIO.read(new File(logoPath));
				gs.drawImage(img, width_4 + width_8, height_4 + height_8, width_4, height_4, null);
				gs.dispose();
				bufImg.flush();
			}

			/* 生成二维码QRCode图片 */
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String fileName = sdf.format(new Date()) + "." + format;
			String url = qrcodePath + fileName;
			File imgFile = new File(url);
			if (!imgFile.exists()) {
				imgFile.mkdirs();
			}
			ImageIO.write(bufImg, format, imgFile);
			System.out.println("生成二维码图片成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析二维码(直接读取二维码信息)
	 */
	public static String decode(String imagePath) {
		// QRCode 二维码图片的文件
		File imageFile = new File(imagePath);
		BufferedImage bufImg = null;
		String content = null;
		try {
			bufImg = ImageIO.read(imageFile);
			QRCodeDecoder decoder = new QRCodeDecoder();
			content = new String(decoder.decode(new CodeImage(bufImg)), "utf-8");
		} catch (IOException e) {
			System.out.println("Error: " + e.getMessage());
			e.printStackTrace();
		} catch (DecodingFailedException dfe) {
			System.out.println("Error: " + dfe.getMessage());
			dfe.printStackTrace();
		}
		return content;
	}

	public static void main(String[] args) {

		Boolean flag = true;//是否添加中间logo!

		QrCode.createQRCode(flag);
//		 String content = QrCode.decode("D:/xxxx.png");//解析二维码图片
//		System.out.println("结束="+content);
	}

}

解析二维码则需要一个实体类:

package com.entity;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

/**
* @author Mongo
*/
public class CodeImage implements QRCodeImage {

	private BufferedImage bufferedImage;

	public CodeImage(BufferedImage image){
        this.bufferedImage = image;
    }  

	@Override
	public int getHeight() {
		return bufferedImage.getHeight();
	}

	@Override
	public int getPixel(int x, int y) {
		return bufferedImage.getRGB(x, y);
	}

	@Override
	public int getWidth() {
		return bufferedImage.getHeight();
	}

}

需要的 jar 包:

Qrcode-C.jar

qrcode-R.jar

原文地址:https://www.cnblogs.com/xuehuashanghe/p/10304021.html

时间: 2024-10-14 14:53:32

使用 Qrcode 生成中间带 logo 的二维码!的相关文章

涛哥的Python脚本工具箱之生成带Logo的二维码

近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应矩阵码,是二维条码的一种.由日本的 Denso Wave 公司于 1994 年发明. 现随着智能手机的普及.已广泛应用于寻常生活中,比如商品信息查询.社交好友互动.网络地址訪问等等. 安装 Python 的二维码库 -- qrcode pip install qrcode 因为生成 qrcode 图

.NET使用ZXing.NET生成中间带图片的二维码

很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后添加相应的命名空间: using System; using System.Collections.Generic; using System.Drawing; using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.QrCo

.NET生成带Logo的二维码

使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.Current; String data = "二维码的内容";//如果是链接会跳转 if (!string.IsNullOrEmpty(data)) { QRCodeEncoder encoder = new QRCodeEncoder(); Bitmap imgBack = encode

PHP生成带logo图像二维码的两种方法

本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $urlToEncode="http://www.php.cn"; generateQRfromGoogle($urlToEncode); /**

C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(一)

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符

js实现生成中间带图片的二维码

之前需要实现生成中间带图片的二维码,所以找了半天终于找到一个可以用的.于是在这里记录一下. 下面是需要注意的几点: 1.使用的js为jquery-qrcode 但是已经经过别人的修改,和网上原来的那些不一样,所以网上的js不能用. 2.生成的图片大小可以调整 3.我尽可能保留了原作者的所有代码,都没有动过. 4.更多的方法和参数还是要参考官方的github和文档. http://files.cnblogs.com/files/linkstar/%E7%94%9F%E6%88%90%E4%B8%A

PHP在线生成带LOGO的二维码

PHP生成二维码的实例程序,网上有很多二维码生成程序,不过都是生成标准的二维码,最近的一个项目要求生成中间是小图标(LOGO)的二维码,后经不断查询资料,终于做出来了,主要核心是使用了国外的一个开源类库--QRCODE,生成确实方便,希望能为大家提供一份参考. 使用注意:在生成带lOGO的二维时:1.请将需要显示在二维码中的LOGO图像命名为emwlogo.gif,格式:gif,放在与ewmlogo.php文件同级的目录下2.请在文本框中输入正确的网址,若网址格式不对,则生成的二维码无效. 在线

生成带logo的二维码

一,生成带log的二维码 1)生成的二维码是流返回,或者是直接写到指定文件夹 二,准备资料 1)引入jar包 <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <!-- 二维码生成器 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId&g

Java生成带logo 的二维码

这个工具类主要实现了两点功能: 1. 生成任意文链接的二维码. 2. 在二维码的中间加入图像. 主要实现步骤: 第一步: 导入QR二维码3.0 版本的core包和一张jpg图片(logo). core包下载地址:http://central.maven.org/maven2/com/google/zxing/core/3.0.0/ 第二步: 新建一个Java project.将刚下载的core-3.0.0 jar 添加到项目依赖中. 具体步骤: 第三步: 新建两个类,分别是: BufferedI