2021-07-06

**

二维码内嵌LOGO生成工具类

**
package common.projects.develop.util;

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

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Hashtable;

/**

  • 二维码生成工具类
    */
    public class CoreCodeUtil {
    //编码格式为 utf-8
    private static final String CHARSET = “utf-8”;
    //生成二维码后图片的类型为 jpg
    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;

    /**

    • 生成二维码图片信息
    • @param content 内容
    • @param imgPath 图片链接地址
    • @param needCompress 是否需要对生成的图片进行缩放处理
    • @return
    • @throws Exception
      */
      private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
      //完善编码类型
      Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
      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;
      }
      // 插入图片
      insertImage(image, imgPath, needCompress);
      return image;
      }

    /**

    • 内置二维码图片
    • @param source 二维码图片
    • @param imgPath logo图片
    • @param needCompress 是否对logo图标进行缩放处理
    • @throws Exception
      */
      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();
      }

    /**

    • 生成二维码的调用方法
    • @param content 内容
    • @param imgPath logo地址
    • @param destPath 生成后文件存储的地址
    • @param needCompress 是否需要对logo图标进行缩放处理
    • @return
    • @throws Exception
      */
      public static void encode(String content, String imgPath, String destPath,boolean needCompress) throws Exception {
      BufferedImage image = createImage(content, imgPath,needCompress);
      createMkdirs(destPath); //判断文件是否存在
      System.out.println("[生成二维码]: content “+content+” destPath+/+file = “+destPath);
      String fileName = RandomUtil.generateLowerString(6)+”.jpg";
      ImageIO.write(image, FORMAT_NAME, new File(destPath+fileName));
      }

    /**

    • 判断文件是否存在 如果存在则如果不存在则创建
    • @param destPath
      */
      public static void createMkdirs(String destPath) {
      File file =new File(destPath);
      //当文件夹不存在或者文件不是一个目录时
      if (!file.exists() && !file.isDirectory()) {
      file.mkdirs();
      }
      }

    /**

    • 通过网址远程拉取文件转换为inputStream流
    • @param fileUrl
    • @return
    • @throws IOException
      */
      public static InputStream fileInputStream(String fileUrl) throws IOException {
      URL url = new URL(fileUrl);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setDoInput(true);
      connection.setDoOutput(true);
      connection.connect();
      return connection.getInputStream();
      }

    public static void main(String[] args) throws Exception {
    String BASE_PATH = “C:\Users\31034\OneDrive\logo.jpg”;
    encode(“http://gs1.hzxihulongjing.xyz/”,BASE_PATH,“C:\Users\31034\Desktop\科元\”,true);
    }
    }

上一篇:<转>Akka是什么?


下一篇:动态代理的两种实现方式(基于接口的动态代理和基于子类的的动态代理)