`
zxmzfbdc
  • 浏览: 47827 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

zxing生成二维码添加图片和文字

 
阅读更多

 直接上代码,以后有时间再添加说明

二维码的基本信息,包括要二维码内包含的文字,嵌入的图片,加到二维码下边的文字

/**
 * 
 */
package com.tong.util.code;

import java.io.File;

/**
 * @author zxm
 *
 */
public class CodeModel {
	private String contents;
	private int width = 400;
	private int height = 400;
	private String format = "gif";
	private String character_set = "utf-8";
	private int fontSize = 12;
	private File logoFile;
	private float logoRatio = 0.20f;
	private String desc;
	private int whiteWidth;//白边的宽度
	private int[] bottomStart;//二维码最下边的开始坐标
	private int[] bottomEnd;//二维码最下边的结束坐标

	public String getContents() {
		return contents;
	}

	public void setContents(String contents) {
		this.contents = contents;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public String getFormat() {
		return format;
	}

	public void setFormat(String format) {
		this.format = format;
	}

	public String getCharacter_set() {
		return character_set;
	}

	public void setCharacter_set(String character_set) {
		this.character_set = character_set;
	}

	public int getFontSize() {
		return fontSize;
	}

	public void setFontSize(int fontSize) {
		this.fontSize = fontSize;
	}

	public File getLogoFile() {
		return logoFile;
	}

	public void setLogoFile(File logoFile) {
		this.logoFile = logoFile;
	}

	public float getLogoRatio() {
		return logoRatio;
	}

	public void setLogoRatio(float logoRatio) {
		this.logoRatio = logoRatio;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	public int getWhiteWidth() {
		return whiteWidth;
	}

	public void setWhiteWidth(int whiteWidth) {
		this.whiteWidth = whiteWidth;
	}

	public int[] getBottomStart() {
		return bottomStart;
	}

	public void setBottomStart(int[] bottomStart) {
		this.bottomStart = bottomStart;
	}

	public int[] getBottomEnd() {
		return bottomEnd;
	}

	public void setBottomEnd(int[] bottomEnd) {
		this.bottomEnd = bottomEnd;
	}
}

 生成二维码

/**
 * 
 */
package com.tong.util.code;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.springframework.util.StringUtils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * @author zxm
 *
 */
public class CodeCreator {
	private static int BLACK = 0x000000;
	private static int WHITE = 0xFFFFFF;
	
	private BufferedImage createCodeImage(CodeModel info){
		String contents = info.getContents();
		int width = info.getWidth();
		int height = info.getHeight();
		Map<EncodeHintType, Object> hint = new HashMap<>();
		hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		hint.put(EncodeHintType.CHARACTER_SET, info.getCharacter_set());
		hint.put(EncodeHintType.MARGIN, 0);
		MultiFormatWriter writer = new MultiFormatWriter();
		BufferedImage img = null;
		try {
			BitMatrix bm = writer.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
			int[] locationTopLeft = bm.getTopLeftOnBit();
			int[] locationBottomRight = bm.getBottomRightOnBit();
			info.setBottomStart(new int[]{locationTopLeft[0], locationBottomRight[1]});
			info.setBottomEnd(locationBottomRight);
			int w = bm.getWidth();
			int h = bm.getHeight();
			img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
			for(int x=0;x<w;x++){
				for(int y=0;y<h;y++){
					img.setRGB(x, y, bm.get(x, y) ? BLACK : WHITE);
				}
			}
		} catch (WriterException e) {
			e.printStackTrace();
		}
		return img;
	}
	
	public void createCodeImage(CodeModel info, OutputStream output){
		BufferedImage bm = createCodeImage(info);
		File logoFile = info.getLogoFile();
		if(logoFile!=null && logoFile.exists()){
			try{
			BufferedImage logoImg = ImageIO.read(logoFile);
			int logoWidth = logoImg.getWidth();
			int logoHeight = logoImg.getHeight();
			int width = bm.getWidth();
			int height = bm.getHeight();
			float ratio = info.getLogoRatio();
			if(ratio>0){
				logoWidth = logoWidth>width*ratio ? (int)(width*ratio) : logoWidth;
				logoHeight = logoHeight>height*ratio ? (int)(height*ratio) : logoHeight;
			}
			int x = (width-logoWidth)/2;
			int y = (height-logoHeight)/2;
			Graphics g = bm.getGraphics();
			g.drawImage(logoImg, x, y, logoWidth, logoHeight, null);
			String desc = info.getDesc();
			//int whiteWidth = 8;
			if(!StringUtils.isEmpty(desc)){
				int whiteWidth = info.getHeight()-info.getBottomEnd()[1];
//				width = info.getBottomEnd()[0]-info.getBottomStart()[0];
//				height = info.getBottomEnd()[1]+1;
				Font font = new Font("黑体", Font.BOLD, info.getFontSize());
				int fontHeight = g.getFontMetrics(font).getHeight();
				//计算需要多少行
				int lineNum = 1;
				int currentLineLen = 0;
				for(int i=0;i<desc.length();i++){
					char c = desc.charAt(i);
					int charWidth = g.getFontMetrics(font).charWidth(c);
					if(currentLineLen+charWidth>width){
						lineNum++;
						currentLineLen = 0;
						continue;
					}
					currentLineLen += charWidth;
				}
				int totalFontHeight = fontHeight*lineNum;
				int wordTopMargin = 4;
				BufferedImage bm1 = new BufferedImage(width, height+totalFontHeight+wordTopMargin-whiteWidth, BufferedImage.TYPE_INT_RGB);
				Graphics g1 = bm1.getGraphics();
				if(totalFontHeight+wordTopMargin-whiteWidth>0){
				g1.setColor(Color.WHITE);
				g1.fillRect(0, height, width, totalFontHeight+wordTopMargin-whiteWidth);
				}
				g1.setColor(new Color(BLACK));
				g1.setFont(font);
				g1.drawImage(bm, 0, 0, null);
				width = info.getBottomEnd()[0]-info.getBottomStart()[0];
				height = info.getBottomEnd()[1]+1;
				currentLineLen = 0;
				int currentLineIndex = 0;
				int baseLo = g1.getFontMetrics().getAscent();
				for(int i=0;i<desc.length();i++){
					String c = desc.substring(i, i+1);
					int charWidth = g.getFontMetrics(font).stringWidth(c);
					if(currentLineLen+charWidth>width){
						currentLineIndex++;
						currentLineLen = 0;
						g1.drawString(c, currentLineLen + whiteWidth, height+baseLo+fontHeight*(currentLineIndex)+wordTopMargin);
						currentLineLen = charWidth;
						continue;
					}
					g1.drawString(c, currentLineLen+whiteWidth, height+baseLo+fontHeight*(currentLineIndex) + wordTopMargin);
					currentLineLen += charWidth;
				}
				g1.dispose();
				bm = bm1;
			}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		try{
			ImageIO.write(bm, StringUtils.isEmpty(info.getFormat()) ? info.getFormat() : info.getFormat(), output);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void createCodeImage(CodeModel info, File file){
		File parent = file.getParentFile();
		if(!parent.exists())parent.mkdirs();
		OutputStream output = null;
		try{
			output = new BufferedOutputStream(new FileOutputStream(file));
			createCodeImage(info, output);
			output.flush();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				output.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void createCodeImage(CodeModel info, String filePath){
		createCodeImage(info, new File(filePath));
	}
}

 二维码读取

/**
 * 
 */
package com.tong.util.code;

import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;

/**
 * @author zxm
 *
 */
public class CodeDecoder {
	public String decode(InputStream input){
		Map<DecodeHintType, Object> hint = new HashMap<DecodeHintType, Object>();
		hint.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
		String result = "";
		try{
		BufferedImage img = ImageIO.read(input);
		int[] pixels = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
		LuminanceSource source = new RGBLuminanceSource(img.getWidth(), img.getHeight(), pixels);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		QRCodeReader reader = new QRCodeReader();
		Result r = reader.decode(bitmap, hint);
		result = r.getText();
		}catch(Exception e){
			result="读取错误";
		}
		return result;
	}
}

 

测试代码

 

/**
 * 
 */
package com.tong.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.tong.util.code.CodeCreator;
import com.tong.util.code.CodeDecoder;
import com.tong.util.code.CodeModel;

/**
 * @author zxm
 *
 */
public class QRCodeMain{
	private static void encode() {
		CodeCreator creator = new CodeCreator();
		CodeModel info = new CodeModel();
		info.setWidth(400);
		info.setHeight(400);
		info.setFontSize(24);
		info.setContents("<a href='http://www.sohu.com'>人生就是拼搏</a>");
		//info.setContents("http://www.sohu.com");
		info.setContents("万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新");
		info.setLogoFile(new File("D:/workspaces/workspace1/tong3/WebContent/img/girl3.jpg"));
		info.setDesc("你怎么会知道我的苦,我是一页孤舟,漂流在尘世中asdfsaf33333abCD1234567890");
		//info.setLogoDesc("一叶浮萍归大海,adsasfbhtjg人生何处不相逢");
		//info.setLogoDesc("一叶浮萍");
		creator.createCodeImage(info, "D:/2Dcode/dest." + info.getFormat());
	}
	
	static public void decode(InputStream input){
		CodeDecoder decoder = new CodeDecoder();
		String result = decoder.decode(input);
		System.out.println(result);
	}
	
	public static void main(String[] args) throws Exception{
		encode();
		//decode(new FileInputStream(new File("D:/2Dcode/dest.gif")));
	}
}
 

 

 

  • 大小: 21.7 KB
分享到:
评论

相关推荐

    zxing生成二维码,图片Base64编码

    在Java环境下,使用ZXing生成二维码的步骤如下: 1. 引入ZXing库:在项目中添加ZXing的依赖,通常通过Maven或Gradle来管理。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;com.google.zxing&lt;/...

    Zxing生成二维码(解决中文乱码)

    这是Zxing的源码,没有打包成jar利于学习使用。...使用时注意path的默认地址,Main类中是生成二维码的代码,GetMain类中是读取二维码的代码。 eclipse中Ctrl+Shift+R快速查找类 希望对你有所帮助。

    ZXing生成可选logo和文字的二维码图片工具类ZXingCodeUtils

    - **可选文字**:用户可以在生成的二维码中添加文字信息,这可能是对二维码内容的简短说明或补充,使得二维码不仅有数据交换功能,还具备一定的展示效果。 - **指定保存路径**:ZXingCodeUtils提供了将生成的...

    zxing彩色二维码工具类

    该工具类目前比较简单,只是实现了普通二维码、logo二维码、彩色二维码和二维码条形码解析几个功能。 根据此工具类可扩展生成LOGO+文字的二维码,暂时不需要没有封装。

    C# 生成二维码源码 可生成图片 底部可显示文字

    本文将详细解析标题为“C# 生成二维码源码 可生成图片 底部可显示文字”的知识内容,以及如何在C#环境中实现这一功能。 首先,C#是微软开发的一种面向对象的编程语言,它具有丰富的类库和强大的.NET框架支持,非常...

    ireport生成一维码和google zxing二维码

    在iReport中生成二维码,我们需要引入ZXing库,这是一个开源的二维码生成和读取库。 1. 引入库:ZXing的javase.jar和core-3.0.0.jar需要添加到项目的类路径中,以支持二维码的生成。 2. 使用自定义函数:由于...

    Zxing生成二维码扫描二维码

    《Zxing:全方位解析二维码生成与扫描》 Zxing,全称“Zebra Crossing”,是一款开源的、跨...通过`DemoZXing-master`这样的实战项目,开发者可以更加深入地理解和运用Zxing,为自己的应用程序添加更多的实用功能。

    JAVA生成二维码,图片合成,图片添加文字对应资源和代码

    在IT行业中,生成二维码、图片合成以及在图片上添加文字是常见的图像处理任务,尤其是在移动应用、营销推广和数据交换等领域。本资源包提供了一个基于Java的解决方案,使用了ZXing库(Zebra Crossing)和Java 2D图形...

    zxing 生成二维码和读取二维码

    - 使用ZXing库生成二维码时,首先需要引入对应的依赖,例如在Java项目中,可以添加ZXing的Maven或Gradle依赖。 - 创建`MultiFormatWriter`对象,它可以处理多种编码格式。 - 使用`BitMatrix`类来创建二维码的二...

    zxing二维码生成与扫描

    对于初学者,可以通过研究这个例子了解如何在自己的项目中集成ZXing,如何生成二维码图片,以及如何处理扫描事件。同时,也可以根据需求自定义扫描界面,优化扫描性能,或增加错误处理机制。 9. **拓展应用** ...

    java生成二维码工具类(带logo和文字说明) 很实用

    如果这是一个实际的API调用流程,我们可以创建一个RESTful接口,接受请求参数(如内容、Logo路径、文字说明等),然后调用`ZXingCode.createQRCodeWithLogoAndText`方法生成二维码图片并返回。 6. **SpringBoot集成...

    C# 生成文字图片二维码

    这段代码中,`GenerateQRCode`函数接收内容字符串和图片尺寸作为参数,返回一个包含该内容的二维码位图。`BarcodeWriter`类用于创建二维码,`EncodingOptions`设置二维码的宽度和高度。 四、使用QRCoder生成二维码 ...

    将所需的内容生成二维码,再导入word中

    4. **添加提示语**:在二维码下方添加文字提示,帮助读者理解二维码包含的信息,比如“扫描二维码获取完整文章”或“保存此二维码以访问我们的官方网站”。 5. **导入Word**:将生成的二维码图片复制到剪贴板,打开...

    Google zxing 二维码生成

    在Java工程中使用ZXing生成二维码,首先需要将库的依赖引入项目。这里提到的"com文件夹"包含了ZXing库的Java源代码,解压后将其放入项目的`src`目录下,意味着开发者可以直接使用这些源代码,而无需通过Maven或...

    C#利用Zxing.net生成条形码和二维码并实现打印,解码

    在本文中,我们将深入探讨如何使用C#编程语言结合Zxing.Net库来生成条形码和二维码,并且实现它们的打印和解码功能。Zxing.Net是一个强大的开源库,它为.NET开发者提供了读取和生成多种条形码和二维码的能力。在...

    Java生成二维码+logo+文字说明.rar

    使用ZXing生成二维码的基本步骤如下: 1. 引入ZXing库:在项目中添加ZXing的依赖,如果是Maven项目,可以在pom.xml文件中添加对应的dependency。 2. 创建二维码内容:定义要编码的数据,可以是字符串、URL或其他可...

    C#使用ZXing.Net生成二维码和条形码,包含识别条码内容

    C#使用ZXing.Net生成二维码和条形码,可以输入的内容生成条码,可以设置条码的宽度和高度,以及各种条码类型,还可以通过拖拽直接识别条码内容 具体操作见:...

    java excel生成二维码(可以添加图标和文字).zip

    在生成二维码时,除了基础的编码数据,还可以选择性地添加图标(Logo)到二维码中心,以及在二维码周围添加辅助文字信息。这需要调整二维码生成器的配置,同时可能涉及到图像合成的技术,即将图标和文字与二维码图像...

    Zxing二维码图片和文字转换

    这个工具类主要用于生成二维码图片。它首先会调用Zxing中的`MultiFormatWriter`来编码输入的文本数据,然后使用`BitMatrix`对象来存储这些数据。接着,`BitMatrix`会被转化为一个二维的像素数组,最后通过`Bitmap....

    zxing生成二维码

    三、使用ZXing生成二维码的步骤 1. 添加依赖:首先,你需要将ZXing库引入到你的项目中。如果是Java或Android项目,可以通过Maven或Gradle添加依赖;对于.NET项目,可以使用NuGet包管理器。 2. 创建编码内容:确定你...

Global site tag (gtag.js) - Google Analytics