基于zxing(https://github.com/zxing/zxing)与maven,针对二维码(包括带图片的二维码)、条形码进行了简单的封装,以便在项目中更好的利用。

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

关于二维码的生成细节与原理,请参考:http://coolshell.cn/articles/10590.html

package com.qrcode;import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
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.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class PRUtil {// 图片宽度的一般private static final int IMAGE_WIDTH = 80;private static final int IMAGE_HEIGHT = 80;private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;private static final int FRAME_WIDTH = 2;/*** 生成普通二维码* * @param contents* @param width* @param height* @param imgPath*/public static void encodePR(String contents, int width, int height, String imgPath) {Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();// 指定纠错等级hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定编码格式hints.put(EncodeHintType.CHARACTER_SET, "GBK");try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,BarcodeFormat.QR_CODE, width, height, hints);MatrixToImageWriter.writeToStream(bitMatrix, "jpg",new FileOutputStream(imgPath));} catch (Exception e) {e.printStackTrace();}}/*** 生成带图片的二维码* * @param content* @param width* @param height* @param srcImagePath* @param destImagePath*/public static void encodePR(String content, int width, int height,String srcImagePath, String destImagePath) {try {ImageIO.write(genBarcode(content, width, height, srcImagePath),"jpg", new File(destImagePath));} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}/*** 针对二维码进行解析* * @param imgPath* @return*/public static String decodePR(String imgPath) {BufferedImage image = null;Result result = null;try {image = ImageIO.read(new File(imgPath));if (image == null) {System.out.println("the decode image may be not exists.");}LuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "GBK");result = new MultiFormatReader().decode(bitmap, hints);return result.getText();} catch (Exception e) {e.printStackTrace();}return null;}/*** 创建条形码* * @param contents* @param width* @param height* @param imgPath*/public static void encodeBar(String contents, int width, int height, String imgPath) {// 条形码的最小宽度int codeWidth = 98;codeWidth = Math.max(codeWidth, width);try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,BarcodeFormat.EAN_13, codeWidth, height, null);MatrixToImageWriter.writeToStream(bitMatrix, "png",new FileOutputStream(imgPath));} catch (Exception e) {e.printStackTrace();}}/*** 针对条形码进行解析* * @param imgPath* @return*/public static String decodeBar(String imgPath) {BufferedImage image = null;Result result = null;try {image = ImageIO.read(new File(imgPath));if (image == null) {System.out.println("the decode image may be not exit.");}LuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));result = new MultiFormatReader().decode(bitmap, null);return result.getText();} catch (Exception e) {e.printStackTrace();}return null;}/*** 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标* * @param srcImageFile 源文件地址* @param height 目标高度* @param width 目标宽度* @param hasFiller 比例不对时是否需要补白:true为补白; false为不补白;* @throws IOException*/private static BufferedImage scale(String srcImageFile, int height, int width,boolean hasFiller) throws IOException {double ratio = 0.0; // 缩放比例File file = new File(srcImageFile);BufferedImage srcImage = ImageIO.read(file);Image destImage = srcImage.getScaledInstance(width, height,BufferedImage.SCALE_SMOOTH);// 计算比例if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {if (srcImage.getHeight() > srcImage.getWidth()) {ratio = (new Integer(height)).doubleValue()/ srcImage.getHeight();} else {ratio = (new Integer(width)).doubleValue()/ srcImage.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);destImage = op.filter(srcImage, null);}if (hasFiller) {// 补白BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D graphic = image.createGraphics();graphic.setColor(Color.white);graphic.fillRect(0, 0, width, height);if (width == destImage.getWidth(null))graphic.drawImage(destImage, 0,(height - destImage.getHeight(null)) / 2,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);elsegraphic.drawImage(destImage,(width - destImage.getWidth(null)) / 2, 0,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);graphic.dispose();destImage = image;}return (BufferedImage) destImage;}/*** 产生带有图片的二维码缓冲图像* @param content* @param width* @param height* @param srcImagePath* @return* @throws WriterException* @throws IOException*/private static BufferedImage genBarcode(String content, int width, int height,String srcImagePath) throws WriterException, IOException {// 读取源图像BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,IMAGE_HEIGHT, true);int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];for (int i = 0; i < scaleImage.getWidth(); i++) {for (int j = 0; j < scaleImage.getHeight(); j++) {srcPixels[i][j] = scaleImage.getRGB(i, j);}}Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();hint.put(EncodeHintType.CHARACTER_SET, "GBK");hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 生成二维码MultiFormatWriter mutiWriter = new MultiFormatWriter();BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,width, height, hint);// 二维矩阵转为一维像素数组int halfW = matrix.getWidth() / 2;int halfH = matrix.getHeight() / 2;int[] pixels = new int[width * height];for (int y = 0; y < matrix.getHeight(); y++) {for (int x = 0; x < matrix.getWidth(); x++) {// 读取图片if (x > halfW - IMAGE_HALF_WIDTH&& x < halfW + IMAGE_HALF_WIDTH&& y > halfH - IMAGE_HALF_WIDTH&& y < halfH + IMAGE_HALF_WIDTH) {pixels[y * width + x] = srcPixels[x - halfW+ IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];}// 在图片四周形成边框else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH- IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)) {pixels[y * width + x] = 0xfffffff;} else {// 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;pixels[y * width + x] = matrix.get(x, y) ? 0xff000000: 0xfffffff;}}}BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);image.getRaster().setDataElements(0, 0, width, height, pixels);return image;}public static void main(String[] args) {String imgPath = "d:/pr1.jpg";String contents = "你好,李四! welcome to zxing!"+ "\n李四的博客[http://my.oschina.net/cloudcoder]"+ "\nEmail[xxx@163.com]";// 普通二维码的生成与解析PRUtil.encodePR(contents, 300, 300, imgPath);System.out.println("生成二维码成功");System.out.println(PRUtil.decodePR(imgPath));// 带图片的二维的生成与解析imgPath = "d:/pr2.png";String srcPath = "d:/src.jpg";PRUtil.encodePR(contents, 300, 300, srcPath,imgPath);System.out.println("生成带图片的二维码成功");System.out.println(PRUtil.decodePR(imgPath));// 条形码的生成与解析imgPath = "d:/bar.png";PRUtil.encodeBar("6923450657713", 105, 50, imgPath);System.out.println("生成条形码成功");System.out.println(PRUtil.decodeBar(imgPath));}
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.test</groupId><artifactId>qrcode</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>qrcode</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.0.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies>
</project>

基于zxing生成与解析二维码、条形码相关推荐

  1. 使用zxing生成与解析二维码

    随着二维码的普及,二维码在生活中的使用使用的场景也越来越来多,本文章就来介绍使用zxing来生成与解析二维码.生成二维码的开源项目很多,选择zxing则是因为其出自Google并且长期有人进行维护,值 ...

  2. SpringBoot 整合zxing生成或解析二维码

    生成无Logo二维码 . 有Logo二维码 和 解析二维码内容 一.导包 二.Demo 三.结果 一.导包 zxing地址:https://mvnrepository.com/artifact/com ...

  3. java利用zxing来生成和解析二维码,支持中文

    java在二维码的生成和解析上,网上有些人说如果要解析中文,得去修改工具包的Encoder类中的 static final String DEFAULT_BYTE_MODE_ENCODING = &q ...

  4. Java实现生成和解析二维码

    Java实现生成和解析二维码 文章目录 Java实现生成和解析二维码 一.建立项目 二.创建工具类 三.创建启动类 一.建立项目 首先需要创建一个普通的 Maven 项目,在这里我用的是 google ...

  5. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  6. java关于Zxing 生成带Logo 二维码图片失真问题

    java关于Zxing 生成带Logo 二维码图片失真问题 问题点 logo本身是高清图片,但是Zxing生成的二维码中,logo像素失真,感觉被严重压缩一样. 排查问题 是Graphics2D 绘制 ...

  7. java生成以及解析二维码

    java生成以及解析二维码 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 ...

  8. 基于zxing的仿微信二维码扫描界面

    基于zxing的仿微信二维码扫描界面 https://github.com/iamlocky/ZxingLite 本项目fork自yangxixi88/ZxingLite,在原项目基础上添加了本地图片 ...

  9. Zxing和QR CODE 生成与解析二维码实例(普通篇)

    首先下载对应的jar包,本实例用的是Zxing2.2jar 下载地址:http://download.csdn.net/detail/gao36951/8161861 Zxing是Google提供的关 ...

最新文章

  1. 1431. Kids With the Greatest Number of Candies
  2. SAP 电商云 Spartacus UI 和路由相关的 State 处理
  3. verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板
  4. 产品架构开发方法(2011中国软件技术大会)
  5. 简易贪吃蛇c语言贴吧,熬书几个月,终于编出简易的贪吃蛇了,VS2013
  6. linux怎样自动检查link文件_怎样理解和识别 Linux 中的文件类型 | Linux 中国
  7. Java基础入门笔记-对象与引用
  8. 刚刚,SeetaFace版本升级!新增活体检测等功能
  9. mysql mysqlslap压力测试用例
  10. 素材网站|设计师下半年的工作流程至少减少了一半...
  11. Volley源码学习2--Error类
  12. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)
  13. Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
  14. 最强大的iptv m3u8 直播源手机检测工具,批量发现问题直播源
  15. 服务器返回状态码说明,关于服务器返回的十四种常见HTTP状态码详解
  16. java中怎么做缓存_Java实现一个简单的缓存方法
  17. 【转】让ubuntu自带词典可以本地查…
  18. 系统缺少OBS Studio的运行时组件 解决方法
  19. A股市场,价投者眼中的10大金股,值得收藏(名单)
  20. Python3之模块及包的导入 import用法

热门文章

  1. Leetcode 188.买卖股票的最佳时机IV
  2. 把玩Fedora29操作系统
  3. Android ScrollView嵌套RecyclerView导致在三星s8曲面屏显示不全问题
  4. python --- re模块
  5. wampserver2.5安装 redis缓存,igbinary, phalcon框架
  6. 日志处理--高效Linux命令整理
  7. 程矢Axure夜话:Axure手机原型视频教程之中继器上下滑动加载更多
  8. conflicting types for xx错误
  9. ARCGIS开发中类型XXX在未被引用的程序集中定义的解决办法
  10. Jquery-core.holdReady()