生成及解析二维码

    <dependency>
        <groupId>net.glxn.qrgen</groupId>
        <artifactId>javase</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.11</version>
    </dependency>

在这里插入图片描述
第一种方法

package com.lyz.utils.testQcode;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
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.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**

  • 测试生成及解析二维码,success
    */
    public class QRCodeUtil {
    private static final String CHARSET = “utf-8”;
    private static final String FORMAT_NAME = “JPG”;
    // 二维码尺寸
    private static final int QRCODE_SIZE = 300;
    // LOGO宽度
    private static final int WIDTH = 60;
    // LOGO高度
    private static final int HEIGHT = 60;

    private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
    Hashtable hints = new Hashtable();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
    hints.put(EncodeHintType.MARGIN, 1);
    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
    hints);
    int width = bitMatrix.getWidth();
    int height = bitMatrix.getHeight();
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
    }
    }
    if (imgPath == null || “”.equals(imgPath)) {
    return image;
    }
    // 插入图片
    QRCodeUtil.insertImage(image, imgPath, needCompress);
    return image;
    }

    private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
    File file = new File(imgPath);
    if (!file.exists()) {
    System.err.println(“” + imgPath + " 该文件不存在!");
    return;
    }
    Image src = ImageIO.read(new File(imgPath));
    int width = src.getWidth(null);
    int height = src.getHeight(null);
    if (needCompress) { // 压缩LOGO
    if (width > WIDTH) {
    width = WIDTH;
    }
    if (height > HEIGHT) {
    height = HEIGHT;
    }
    Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics g = tag.getGraphics();
    g.drawImage(image, 0, 0, null); // 绘制缩小后的图
    g.dispose();
    src = image;
    }
    // 插入LOGO
    Graphics2D graph = source.createGraphics();
    int x = (QRCODE_SIZE - width) / 2;
    int y = (QRCODE_SIZE - height) / 2;
    graph.drawImage(src, x, y, width, height, null);
    Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
    graph.setStroke(new BasicStroke(3f));
    graph.draw(shape);
    graph.dispose();
    }

    public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
    BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
    mkdirs(destPath);
    // String file = new Random().nextInt(99999999)+“.jpg”;
    // ImageIO.write(image, FORMAT_NAME, new File(destPath+“/”+file));
    ImageIO.write(image, FORMAT_NAME, new File(destPath));
    }

    public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
    BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
    return image;
    }

    public static void mkdirs(String destPath) {
    File file = new File(destPath);
    // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
    if (!file.exists() && !file.isDirectory()) {
    file.mkdirs();
    }
    }

    public static void encode(String content, String imgPath, String destPath) throws Exception {
    QRCodeUtil.encode(content, imgPath, destPath, false);
    }
    // 被注释的方法
    /*

    • public static void encode(String content, String destPath, boolean
    • needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath,
    • needCompress); }
      */

    public static void encode(String content, String destPath) throws Exception {
    QRCodeUtil.encode(content, null, destPath, false);
    }

    public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
    throws Exception {
    BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
    ImageIO.write(image, FORMAT_NAME, output);
    }

    public static void encode(String content, OutputStream output) throws Exception {
    QRCodeUtil.encode(content, null, output, false);
    }

    public static String decode(File file) throws Exception {
    BufferedImage image;
    image = ImageIO.read(file);
    if (image == null) {
    return null;
    }
    BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    Result result;
    Hashtable hints = new Hashtable();
    hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
    result = new MultiFormatReader().decode(bitmap, hints);
    String resultStr = result.getText();
    return resultStr;
    }

    public static String decode(String path) throws Exception {
    return QRCodeUtil.decode(new File(path));
    }

    public static void main(String[] args) throws Exception {
    // 存放在二维码中的内容
    String text = “我是小铭”;
    // 嵌入二维码的图片路径
    String imgPath = “E:\testfile\dog.jpg”;
    // 生成的二维码的路径及名称
    String destPath = “E:\testfile\jam.jpg”;
    //生成二维码
    QRCodeUtil.encode(text, imgPath, destPath, true);
    // 解析二维码
    String str = QRCodeUtil.decode(destPath);
    // 打印出解析出的内容
    System.out.println(str);

    }
    }
    结果如下:
    在这里插入图片描述
    第二种方法

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.alibaba.fastjson.JSON;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import lombok.extern.slf4j.Slf4j;

/**

  • 测试生成二维码 success
    */
    @Slf4j
    public class QrCodeUtils {

    public static void main(String[] args) {
    String qrCodePath = “www.baidu.com”;
    String qrCodeLocalPath = “E:\testfile\百度首页22.png”;
    try {
    // 生成不带白边的二维码
    QrCodeUtils.generatorQrCode(qrCodePath, qrCodeLocalPath);
    } catch (Exception e) {
    log.info(“error :{}”, JSON.toJSON(e));
    }
    }

    /**

    • 生成不带白边的二维码

    • @param content 二维码内容(目标url)

    • @param qrCodePath 生成的二维码地址(最终保存地址)

    • @throws Exception 异常
      */
      public static void generatorQrCode(String content, String qrCodePath) throws Exception {
      Map<EncodeHintType, Object> hints = new HashMap<>();

      hints.put(EncodeHintType.MARGIN, 0);
      BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, 256, 256, hints);

      // 去白边
      int[] rec = bitMatrix.getEnclosingRectangle();
      int resWidth = rec[2] + 1;
      int resHeight = rec[3] + 1;
      BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
      resMatrix.clear();
      for (int i = 0; i < resWidth; i++) {
      for (int j = 0; j < resHeight; j++) {
      if (bitMatrix.get(i + rec[0], j + rec[1])) {
      resMatrix.set(i, j);
      }
      }
      }
      int width = resMatrix.getWidth();
      int height = resMatrix.getHeight();
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
      if (resMatrix.get(x, y)) {
      //image.setRGB(x, y, Color.BLACK.getRGB());
      image.setRGB(x, y, -16777216);
      } else {
      //image.setRGB(x, y, Color.WHITE.getRGB());
      image.setRGB(x, y, -1);
      }
      }
      }
      ImageIO.write(image, “png”, new File(qrCodePath));
      }
      }
      在这里插入图片描述
      生成条形码

import com.itextpdf.text.pdf.Barcode128;
import com.lyz.utils.ErrorException;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
/**

  • 测试生成条形码 success
    */
    public class BarcodeUtil {

    public static void main(String[] args) {
    createBarcode(“test”,“E:\testfile\百度首页66.png”);
    }

    public static void createBarcode(String listNo, String imagePath) {
    Font font = new Font(“”, Font.PLAIN, 12);
    Barcode128 barcode128 = new Barcode128();
    barcode128.setCode(listNo);
    Image pdfImg = barcode128.createAwtImage(Color.black, Color.white);
    BufferedImage img = new BufferedImage(pdfImg.getWidth(null), pdfImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    // g.fillRect(0, 0, pdfImg.getWidth(null), pdfImg.getHeight(null) + HEIGHT_SPACE);
    // FontRenderContext fontRenderContext = ((Graphics2D)g).getFontRenderContext();
    // // 图片横坐标开始位置
    // int startX = 0;
    // // 图片纵坐标开始位置
    // int imageStartY = 0;
    // int stringStartY = pdfImg.getHeight(null) + HEIGHT_SPACE;// 条形码(文字)开始位置
    // int codeWidth = (int) font.getStringBounds(listNo, fontRenderContext).getWidth();
    g.drawImage(pdfImg, 0, 0, Color.white, null);
    // AttributedString ats = new AttributedString(listNo);
    // ats.addAttribute(TextAttribute.FONT, font, 0, listNo.length());
    // AttributedCharacterIterator iter = ats.getIterator();
    // g.setColor(Color.BLACK);// 绘制条形码(文字)
    // g.drawString(iter, + (pdfImg.getWidth(null) - codeWidth) / 2 , stringStartY);
    // g.dispose();
    try {
    ImageIO.write(img, “PNG”, new File(imagePath));
    } catch (Exception e) {
    throw new ErrorException(400, “生成条形码出错!”);
    }
    }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值