二维码生成是使用 google 开源图形码工具Zxing。

maven依赖如下:

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version>
</dependency>

具体实现直接上代码:

1.二维码相关

public class ZxingKit {private final static String PNG = "png";/**** @param url url* @return base64 string*/public static String urlToBase64(String url) {File file = new File("/image/");if (!file.exists()) {file.mkdirs();}String uuid = UUID.randomUUID().toString().replaceAll("-","");String saveImgFilePath = "/image/code_"+uuid+".png";Boolean encode = encode(url, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, PNG, 200, 200,saveImgFilePath);if (encode) {return ImageToBase64ByLocal(saveImgFilePath);} else {return "";}}/**** @param url url* @param width 二维码宽度* @param height 二维码高度* @return base64 string*/public static String urlToBase64(String url, int width, int height) {File file = new File("/image/");if (!file.exists()) {file.mkdirs();}String uuid = UUID.randomUUID().toString().replaceAll("-","");String saveImgFilePath = "/image/code_"+uuid+".png";Boolean encode = encode(url, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, PNG, width, height,saveImgFilePath);if (encode) {return ImageToBase64ByLocal(saveImgFilePath);} else {return "";}}/**** @param url url* @param width 二维码宽度* @param height 二维码高度* @param imgPath  二维码路径* @return base64 string*/public static String urlToBase64(String url, int width, int height, String imgPath) {Boolean encode = encode(url, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, PNG, width, height,imgPath);if (encode) {return ImageToBase64ByLocal(imgPath);} else {return "";}}/*** Zxing图形码生成工具** @param contents        内容* @param barcodeFormat   BarcodeFormat对象* @param format          图片格式,可选[png,jpg,bmp]* @param width           宽* @param height          高* @param margin          边框间距px* @param saveImgFilePath 存储图片的完整位置,包含文件名* @return {boolean}*/public static boolean encode(String contents, BarcodeFormat barcodeFormat, Integer margin,ErrorCorrectionLevel errorLevel, String format, int width, int height, String saveImgFilePath) {Boolean bool = false;BufferedImage bufImg;Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();// 指定纠错等级hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel);hints.put(EncodeHintType.MARGIN, margin);hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {// contents = new String(contents.getBytes("UTF-8"), "ISO-8859-1");BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, barcodeFormat, width, height, hints);MatrixToImageConfig config = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);bufImg = MatrixToImageWriter.toBufferedImage(bitMatrix, config);bool = writeToFile(bufImg, format, saveImgFilePath);} catch (Exception e) {e.printStackTrace();}return bool;}/*** @param outputStream  可以来自response,也可以来自文件* @param contents      内容* @param barcodeFormat BarcodeFormat对象* @param margin        图片格式,可选[png,jpg,bmp]* @param errorLevel    纠错级别 一般为:ErrorCorrectionLevel.H* @param format        图片格式,可选[png,jpg,bmp]* @param width         宽* @param height        高*                      eg:*                      ZxingKit.encodeOutPutSteam(response.getOutputStream(), qrCodeUrl, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, "png", 200, 200);*/public static void encodeOutPutSteam(OutputStream outputStream, String contents, BarcodeFormat barcodeFormat, Integer margin, ErrorCorrectionLevel errorLevel, String format, int width, int height) {Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel);hints.put(EncodeHintType.MARGIN, margin);hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {BitMatrix bitMatrix = (new MultiFormatWriter()).encode(contents, barcodeFormat, width, height, hints);MatrixToImageWriter.writeToStream(bitMatrix, format, outputStream);} catch (Exception e) {e.printStackTrace();} finally {IOUtils.closeQuietly(outputStream);}}/*** @param srcImgFilePath 要解码的图片地址* @return {Result}*/@SuppressWarnings("finally")public static Result decode(String srcImgFilePath) {Result result = null;BufferedImage image;try {File srcFile = new File(srcImgFilePath);image = ImageIO.read(srcFile);if (null != image) {LuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");result = new MultiFormatReader().decode(bitmap, hints);} else {throw new IllegalArgumentException("Could not decode image.");}} catch (Exception e) {e.printStackTrace();} finally {return result;}}/*** 将BufferedImage对象写入文件** @param bufImg          BufferedImage对象* @param format          图片格式,可选[png,jpg,bmp]* @param saveImgFilePath 存储图片的完整位置,包含文件名* @return {boolean}*/@SuppressWarnings("finally")public static boolean writeToFile(BufferedImage bufImg, String format, String saveImgFilePath) {Boolean bool = false;try {File f = new File(saveImgFilePath);if (!f.exists()) {f.mkdirs();}bool = ImageIO.write(bufImg, format, f);} catch (Exception e) {e.printStackTrace();} finally {return bool;}}/*** 本地图片转换成base64字符串** @param path 图片位置* @reture 图片Base64* @author Byr* @dateTime 2019-03-07*/public static String ImageToBase64ByLocal(String path) {InputStream in = null;byte[] data = null;// 读取图片字节数组try {//获取图片路径File file = new File(path);in = new FileInputStream(file.getPath());data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();// 返回Base64编码过的字节数组字符串return "data:image/png;base64," + encoder.encode(data);}/*** 对字节数组字符串进行Base64解码并生成图片* @param imgStr* @param imgFilePath* @return*/public static boolean GenerateImage(String imgStr, String imgFilePath) {// 图像数据为空if (imgStr == null){return false;}imgStr = imgStr.replace("data:image/png;base64,","");BASE64Decoder decoder = new BASE64Decoder();try {// Base64解码byte[] bytes = decoder.decodeBuffer(imgStr);for (int i = 0; i < bytes.length; ++i) {// 调整异常数据if (bytes[i] < 0) {bytes[i] += 256;}}// 生成jpeg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(bytes);out.flush();out.close();return true;} catch (Exception e) {return false;}}/*** base64 解码* @param imgstr imgstr* @return base64 string*/public static String base64Decode(String imgstr) {File file = new File("/image/");if (!file.exists()) {file.mkdirs();}String uuid = UUID.randomUUID().toString().replaceAll("-","");String saveImgFilePath = "/image/decode_"+uuid+".jpg";Boolean encode = GenerateImage(imgstr, saveImgFilePath);if (encode) {Result decode = decode(saveImgFilePath);String text = decode.getText();return text;} else {return "";}}public static void main(String[] args) {
//      String saveImgFilePath = "D://zxing2.png";
//      Boolean encode = encode("https://www.baidu.com", BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, "png", 200, 200,
//              saveImgFilePath);
//      if (encode) {
//          String toBase64ByLocal = ImageToBase64ByLocal(saveImgFilePath);
//          System.out.println(toBase64ByLocal);
//          Result result = decode(saveImgFilePath);
//          String text = result.getText();
//          System.out.println(text);
//      }String s = urlToBase64("web_login,22222222222iugyuigjhgvjhfgh");
//        System.out.println(GenerateImage(s, "D:\\112.jpg"));
//        Result decode = decode("D:\\\\112.jpg");
//        String text = decode.getText();String s1 = base64Decode(s);System.out.println(s1);}
}

2. base64与图片互转

/*** 本地图片转换成base64字符串** @param path 图片位置* @reture 图片Base64* @author Byr* @dateTime 2019-03-07*/public static String ImageToBase64ByLocal(String path) {InputStream in = null;byte[] data = null;// 读取图片字节数组try {//获取图片路径File file = new File(path);in = new FileInputStream(file.getPath());data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();// 返回Base64编码过的字节数组字符串return "data:image/png;base64," + encoder.encode(data);}/*** 对字节数组字符串进行Base64解码并生成图片* @param imgStr* @param imgFilePath* @return*/public static boolean GenerateImage(String imgStr, String imgFilePath) {// 图像数据为空if (imgStr == null){return false;}imgStr = imgStr.replace("data:image/png;base64,","");BASE64Decoder decoder = new BASE64Decoder();try {// Base64解码byte[] bytes = decoder.decodeBuffer(imgStr);for (int i = 0; i < bytes.length; ++i) {// 调整异常数据if (bytes[i] < 0) {bytes[i] += 256;}}// 生成jpeg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(bytes);out.flush();out.close();return true;} catch (Exception e) {return false;}}

有问题欢迎留言~

Java生成二维码以及二维码解码,图片与base64互相转化的实现相关推荐

  1. JAVA 生成数据表图标LOGO二维码

    JAVA 生成数据表图标LOGO二维码 private static final int QRCOLOR = 0xFF000000; // 默认是黑色private static final int ...

  2. Java生成四种格式的二维码

    2022年2月23日 随着技术的不断发展与更新,现在的二维码的生成,完全可以交给前端来进行实现. 基于谷歌zxing实现的生成二维码工具类.可生成纯二维码:带Logo二维码:带文字二维码:带Logo带 ...

  3. iText5实现Java生成PDF文件完整版,二维码

    iText5实现Java生成PDF文件完整版 vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ? Vue打印文件(v-print ...

  4. java生成、识别条形码和二维码

    一.概述 使用 zxing 开源库 Zxing主要是Google出品的,用于识别一维码和二维码的第三方库 主要类: BitMatrix 位图矩阵 MultiFormatWriter 位图编写器 Mat ...

  5. java 生成带网络头像的二维码

    最近做一个带微信头像的二维码的功能,微信头像是一个链接,所以先把微信头像下载,临时保存,生成二维码 /*** 文件下载工具类** @author zhengxinghua*/ public class ...

  6. java生成SSCC编码第18位校验码

    问题描述 java实现SSCC编码校验位 public String add18EAN(String value) {if (value.length() < 17) {return value ...

  7. Java生成随机邀请码

    Java生成随机10位不重复邀请码 public static void main(String[] args) {for (int i = 0; i < 10; i++) {System.ou ...

  8. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  9. 如何使用 Java 生成二维码?

    1. 下载jar包(QRCode.jar) 下载网址如下: QRCode生成二维码网址:http://swetake.com/qrcode/index-e.html 2. maven项目手动引入jar ...

最新文章

  1. 玩转X-CTR100 l STM32F4 l DAC数字模拟转换
  2. BS开发中常用的Javascript技术
  3. 剑指 Offer 28. 对称的二叉树【无取巧,易于理解!】
  4. 今日代码(20210313)--美赛代码记录
  5. Windows Terminal完整指南
  6. python D9 初识函数
  7. 闯关IPO,“3D云设计第一股”群核科技值不值20亿美金估值?
  8. 华为eNSP基本操作
  9. Springboot在线电影订票系统
  10. 前端直传阿里云OSS
  11. word文档图标变成白纸_word文档图标显示异常怎么办
  12. 敏捷开发 建立愿景、使命_敏捷产品计划:愿景,战略和策略
  13. java你好代码_Java 基础——1 向Java世界说你好
  14. 辅音字母组合功能音中的浊化现象
  15. 爱和感恩2021年末记
  16. 报告女王陛下,我找到了可以吃的塑料杯!
  17. handsome主题添加服务器信息,Typecho handsome主题一言接口修改,使用自己的一言服务...
  18. 微商如何利用微信公众号来盈利
  19. 信息学奥赛一本通——2062:【例1.3】电影票
  20. 指向vector的指针

热门文章

  1. 【PAT】1001. A+B Format
  2. 【算法】约瑟夫环原理及其公式
  3. mysql数据库存储表情都是问号_数据库保存中文全为问号以及emoji表情保存出错...
  4. 如何使用新版万能地图下载器下载谷歌地球影像
  5. MySql报错:Every derived table must have its own alias
  6. 想发起一个开源代码查查网的公益事情
  7. Python之split
  8. ASEMI电磁炉整流桥KBJ2510参数和性能
  9. MFC实时显示鼠标坐标
  10. 从Select出发认识SQL语句