采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version>
</dependency>

参考了不少文章,感谢分享

一、条形码

EAN码是国际物品编码协会制定的一种商品用条码,通用于全世界。EAN码符号有标准版(EAN-13)和缩短版(EAN-8)两种。标准版表示13位数字,又称为EAN13码,缩短版表示8位数字,又称EAN8。两种条码的最后一位为校验位,由前面的12位或7位数字计算得出,所以这个码不是随便瞎写的。

package com.phil.common.util;import java.awt.image.BufferedImage;
import java.io.File;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
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;/*** ZXing条形码编码/解码* * @author phil* @date 2017年8月30日*/
public class ZxingCode {/*** 条形码编码* * @param contents* @param width* @param height* @param imgPath*/public static void encode(String contents, int width, int height, String imgPath) {int codeWidth = 3 + // start guard(7 * 6) + // left bars5 + // middle guard(7 * 6) + // right bars3; // end guardcodeWidth = Math.max(codeWidth, width);try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,BarcodeFormat.EAN_13, codeWidth, height, null);MatrixToImageWriter.writeToFile(bitMatrix, "png", new File(imgPath));} catch (Exception e) {e.printStackTrace();}}/*** 条形码解码* * @param imgPath* @return String*/public static String decode(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 args*/public static void main(String[] args) {String imgPath = "F:/zxing_EAN-13.png";String contents = "6926557300360";int width = 105, height = 50;encode(contents, width, height, imgPath);System.out.println("finished zxing EAN-13 encode.");String decodeContent = decode(imgPath);System.out.println("解码内容如下:" + decodeContent);System.out.println("finished zxing EAN-13 decode.");}
}

执行结果:

finished zxing EAN-13 encode.
解码内容如下:6926557300360
finished zxing EAN-13 decode.

二、二维码

二维码就不多介绍了,现在各种各样的二维码,网址、名片、付款码、商品二维码、优惠券、会员信息。。。
package com.phil.common.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;import javax.imageio.ImageIO;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;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.MatrixToImageConfig;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/*** ZXing二维码生成/解码* @author phil* @date 2017年8月30日**/
public class ZXingCode {public static void main(String[] args) throws WriterException {try {String logoPath = "F:/logo.jpg";String logo_savePath = "F:/" + new Date().getTime() + ".png";String str = toQRCode("http://blog.csdn.net/phil_jing", logoPath, logo_savePath,  "CSDN博客");System.out.println("finished zxing QRcode encode.");System.out.println(Arrays.toString(Base64.decodeBase64(str)));} catch (Exception e) {e.printStackTrace();}}/*** 生成二维码图片* @param content* @param logoPath* @param savePath* @param remark* @return*/public static String toQRCode(String content, String logoPath, String savePath, String remark) {int width = 400, height = 400;try {BufferedImage bim = toBufferedImage(content, BarcodeFormat.QR_CODE, width, height, toDecodeHintType());return encode(bim, logoPath, savePath, new LogoConfig(), remark);} catch (Exception e) {e.printStackTrace();}return null;}/*** 是否需要给二维码图片添加Logo* @param bim* @param logoPath* @param savePath* @param logoConfig* @param remark* @return*/private static String encode(BufferedImage bim, String logoPath, String savePath, LogoConfig logoConfig, String remark) {ByteArrayOutputStream baos = null;try {/*** 读取二维码图片*/BufferedImage image = bim;if(StringUtils.isBlank(logoPath)){ //不需要添加logobaos = new ByteArrayOutputStream();baos.flush();ImageIO.write(image, "png", baos);//流输出//ImageIO.write(bim, "png", new File(savePath));//直接写入某路径,本地测试加上return Base64.encodeBase64URLSafeString(baos.toByteArray());//Encodes binary data using a URL-safe variation of the base64 algorithm}/*** 构建绘图对象*/Graphics2D g = image.createGraphics();/*** 读取Logo图片*/BufferedImage logo = ImageIO.read(new File(logoPath));/*** 设置logo的大小,设置为二维码图片的20%,因为过大会盖掉二维码*/int widthLogo = logo.getWidth(null) > image.getWidth() * 3 / 10 ? (image.getWidth() * 3 / 10): logo.getWidth(null),heightLogo = logo.getHeight(null) > image.getHeight() * 3 / 10 ? (image.getHeight() * 3 / 10): logo.getWidth(null);/*** logo放在中心*/int x = (image.getWidth() - widthLogo) / 2;int y = (image.getHeight() - heightLogo) / 2;/*** logo放在右下角 int x = (image.getWidth() - widthLogo); int y = (image.getHeight() - heightLogo);*/// 开始绘制图片g.drawImage(logo, x, y, widthLogo, heightLogo, null);// g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);// g.setStroke(new BasicStroke(logoConfig.getBorder()));// g.setColor(logoConfig.getBorderColor());// g.drawRect(x, y, widthLogo, heightLogo);g.dispose();// 把备注添加上去,备注不要太长超过两行会自动截取if (  StringUtils.isNotBlank(remark)){// 新的图片,把带logo的二维码下面加上文字BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);Graphics2D outg = outImage.createGraphics();// 画二维码到新的面板outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);// 画文字到新的面板outg.setColor(Color.BLACK);outg.setFont(new Font("微软雅黑", Font.BOLD, 30)); // 字体、字型、字号int strWidth = outg.getFontMetrics().stringWidth(remark);if (strWidth > 399) {// //长度过长就截取前面部分// outg.drawString(productName, 0, image.getHeight() +// (outImage.getHeight() - image.getHeight())/2 + 5 ); //画文字String productName1 = remark.substring(0, remark.length() / 2);String productName2 = remark.substring(remark.length() / 2, remark.length());int strWidth1 = outg.getFontMetrics().stringWidth(productName1);int strWidth2 = outg.getFontMetrics().stringWidth(productName2);outg.drawString(productName1, 200 - strWidth1 / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12);BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);Graphics2D outg2 = outImage2.createGraphics();outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);outg2.setColor(Color.BLACK);outg2.setFont(new Font("微软雅黑", Font.BOLD, 30)); // 字体、字型、字号outg2.drawString(productName2, 200 - strWidth2 / 2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight()) / 2 + 5);outg2.dispose();outImage2.flush();outImage = outImage2;} else {outg.drawString(remark, 200 - strWidth / 2, image.getHeight() + (outImage.getHeight() - image.getHeight()) / 2 + 12); // 画文字}outg.dispose();outImage.flush();image = outImage;}logo.flush();image.flush();baos = new ByteArrayOutputStream();baos.flush();ImageIO.write(image, "png", baos); //不用MatrixToImageWriter//ImageIO.write(image, "png", new File(savePath));//直接写入某路径return Base64.encodeBase64URLSafeString(baos.toByteArray());} catch (Exception e) {e.printStackTrace();} finally {IOUtils.closeQuietly(baos);}return null;}/*** 生成二维码bufferedImage图片* @param content 编码内容* @param barcodeFormat 编码类型* @param width 图片宽度* @param height 图片高度* @param hints 设置参数* @return*/private static BufferedImage toBufferedImage(String content, BarcodeFormat barcodeFormat, int width, int height,Map<EncodeHintType, ?> hints) {MultiFormatWriter multiFormatWriter = null;BitMatrix bitMatrix = null;BufferedImage image = null;try {multiFormatWriter = new MultiFormatWriter();// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数bitMatrix = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);int w = bitMatrix.getWidth();int h = bitMatrix.getHeight();image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);// 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色for (int x = 0; x < w; x++) {for (int y = 0; y < h; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? MatrixToImageConfig.BLACK : MatrixToImageConfig.WHITE);}}} catch (WriterException e) {e.printStackTrace();}return image;}/*** 设置二维码的格式参数* @return*/private static Map<EncodeHintType, Object> toDecodeHintType() {// 用于设置QR二维码参数Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();// 设置QR二维码的纠错级别(H为最高级别)具体级别信息hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 设置编码方式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.MARGIN, 0);//hints.put(EncodeHintType.MAX_SIZE, 350);//Only applicable to Data Matrix now//hints.put(EncodeHintType.MIN_SIZE, 100);//Only applicable to Data Matrix nowreturn hints;}/*** 二维码解码* * @param imgPath* @return */public static String decode(String imgPath) {BufferedImage image = null;Result result = null;try {File file = new File(imgPath);image = ImageIO.read(file);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));Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");result = new MultiFormatReader().decode(bitmap, hints);return result.getText();} catch (Exception e) {e.printStackTrace();}return null;}
}
/*** Logo图片配置* @author phil* @date 2017年8月30日**/
class LogoConfig {// logo默认边框颜色public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;// logo默认边框宽度public static final int DEFAULT_BORDER = 2;// logo大小默认为照片的1/5public static final int DEFAULT_LOGOPART = 5;private final int border = DEFAULT_BORDER;private final Color borderColor;private final int logoPart;/*** Creates a default config with on color {@link #BLACK} and off color* {@link #WHITE}, generating normal black-on-white barcodes.*/public LogoConfig() {this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);}public LogoConfig(Color borderColor, int logoPart) {this.borderColor = borderColor;this.logoPart = logoPart;}public Color getBorderColor() {return borderColor;}public int getBorder() {return border;}public int getLogoPart() {return logoPart;}
}

效果图,扫扫有惊喜

  

ZXing生成条形码、二维码、带logo二维码相关推荐

  1. zxing 二维码、带logo二维码生成

    <span style="font-size:18px;">普通二维码生成</span> <span style="font-size:18 ...

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

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

  3. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...

    QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生成带 Logo 二维码.支持微博微信 QQ 二维码扫描样式 参考链接:https://github.com/bingoogolapple/B ...

  4. ZXing3.3.3 生成二维码带logo

    一.前言 我们这里对ZXing不做过多介绍,不清楚的小伙伴可以自行百度. 直接进入正题,这里会封装成工具使用: 二.Hutool工具包+ZXing 这里我们使用Hutool工具包+ZXing,Huto ...

  5. qrcode生成带logo二维码

    qrcode生成带logo二维码 要点:因为qrcode生成二码后会把canvas隐藏,华为手机不生效且微信不支持canvas长按识别,需要把canvas转图片: 1 . 引入文件 <scrip ...

  6. python 生成带logo二维码

    -- coding: utf-8 -- """ pip install image pip install qrcode author = 'haiousy@163.co ...

  7. 用ZXing 生成条形码和二维码图片

    关于ZXing 就不用多介绍了,本问主要介绍如何使用ZXing 生成条形码和二维码的图片. Release 版本的dll下载地址:http://zxingnet.codeplex.com/ 下载完成后 ...

  8. java 使用zxing生成条形码(可自定义文字位置、边框样式)

    最新工作中遇到生成条形码的需求,经过一番摸索之后找到了zxing这个工具类,实现效果如下: 首先引入依赖: <!-- 条形码生成器 --><dependency><gro ...

  9. TP新版抢单系统开源招财宝自由宝HZ区块系统源码+带门票支付+激活码功能

    简介: TP新版抢单系统,招财宝自由宝HZ区块系统源码带门票与激活码功能源代码全开源无加密[Thinkphp内核] 源码为原始版本 完整版本 为框架源码 如完善细节功能运营请自行修改二开 提示:程序为 ...

最新文章

  1. NLP:利用DictVectorizer对使用字典存储的数据进行特征抽取与向量化
  2. 【特征】机器学习之特征优选
  3. perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset
  4. Linux CPU数、物理核、逻辑核的查看方法及线程进程的绑定方法
  5. python判断正数和负数教案_正数和负数 教学设计
  6. 查看和修改Oracle数据库服务器端的字符集
  7. 16.U-boot的工作流程分析-2440
  8. 留守女孩携笔从戎,被录取为空军飞行员
  9. vscode中 解决格式化后将单引号变双引号
  10. javascript中的call()和apply()方法 - 原创实例
  11. Python中通常不应该犯的7个错误
  12. centos 7 8安装quaartus 遇到的问题及解决方法
  13. oracle pl/sql如何定义变量
  14. 介绍几款串口监控工具
  15. 【算法基础三】算法如何入门?零基础入门算法应该学些什么?
  16. 单片机的多路温度采集系统
  17. 人工神经网络理论及应用,人工智能神经网络论文
  18. python 缩放图片_Python实现图片尺寸缩放脚本
  19. CAD中插入外部参照字体会变繁体_知道这些技巧-轻松攻克CAD所有困难
  20. tomcat启动“成功”,但是浏览器无法访问

热门文章

  1. wow.js结合animate.css实现滚动页面触发animate动画效果
  2. 开发模型的理解:瀑布模型/增量式/迭代/敏捷开发——笔记
  3. 魔兽争霸等老游戏运行时无法全屏(有黑边)的解决方法
  4. three.js BIM可视化练习
  5. 【OJ】问题 B: 统计人数
  6. WuThreat身份安全云-TVD每日漏洞情报-2023-05-19
  7. ResizeObserver loop limit exceeded 解决
  8. FOC控制笔记 - 基本概念
  9. partition by
  10. Pico neo3 全景视频 从零开始 开发记录