Browse Source

二维码生成

jk-GitHub-coder 4 years ago
parent
commit
e4e6279cdf

+ 7 - 0
YijiaRestful/pom.xml

@@ -20,6 +20,13 @@
     </properties>
 
     <dependencies>
+        <!--生成二维码使用的依赖-->
+        <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.3</version>
+        </dependency>
 
         <!--swagger图形化接口-->
         <dependency>

+ 182 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/QRcodeUtils.java

@@ -0,0 +1,182 @@
+package com.platform.yijia.utils;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+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.util.Hashtable;
+
+/**
+ * <Title> QRcodeUtils </Title>
+ * <description>二维码生成: 使用Google.ZXing工具包生成二维码图片</description>
+ * @author JK
+ * @date 2019年11月4日
+ */
+public class QRcodeUtils {
+
+    //防止中文乱码
+    private static final String CHARSET = "utf-8";
+    //格式
+    private static final String FORMAT_NAME = "JPG";
+    //设置二维码尺寸
+    private static final int QRCODE_SIZE = 150;
+    //设置logo宽度
+    private static final int WIDTH = 40;
+    //设置logo高度
+    private static final int HEIGHT =40;
+
+    /****
+     *  生成含有二维码的图片
+     * @param file      底层图片
+     * @param x         距离左上角的X偏移量
+     * @param y         距离左上角的Y偏移量
+     * @param alpha     透明度, 选择值从0.0~1.0: 完全透明~完全不透明
+     * @param content   二维码内容
+     * @param logoImgPath  logo图片地址:不用logo可以为null
+     * @param savePath      生成含有二维码的保存路径
+     * @param needCompress  logo图片数否需要压缩
+     * @param  id 活动id
+     * @param inviteesId 邀请人id
+     * @return
+     * @throws IOException
+     * @throws WriterException
+     */
+    public static String imgContainQRcode(File file, int x, int y, float alpha, String content, String logoImgPath, String savePath, boolean needCompress,Integer id,String inviteesId) throws IOException, WriterException {
+        //读取底层图片
+        BufferedImage bufferedImage = ImageIO.read(file);
+        //获取二维码图片
+        BufferedImage qrCodeImg = QRcodeUtils.createImage(content, logoImgPath, needCompress);
+        //在底图上开始绘图
+        Graphics2D graphics2D = bufferedImage.createGraphics();
+        //获取二维码高宽度
+        int height = qrCodeImg.getHeight();
+        int width = qrCodeImg.getWidth();
+        //实现俩张图片混合
+        graphics2D.drawImage(qrCodeImg, x, y, height, width, null);
+        graphics2D.dispose();
+
+        //判断保存路径文件夹是否存在
+        File f = new File(savePath);
+        if(!f.exists() && !f.isDirectory()){
+            f.mkdir();
+        }
+        //使用时间戳命名新和成的图片
+        //file.getName();
+        //String strFile = System.currentTimeMillis() + ".jpg";
+        String strFile = id+inviteesId + ".jpg";
+
+        ImageIO.write(bufferedImage, FORMAT_NAME, new File(savePath + "/" + strFile));
+        return strFile;
+    }
+    /*****
+     * 生成内嵌logo二维码到指定保存路径
+     *  若生成无logo二维码则设置imgLogoPath为null即可
+     * @param content   内容
+     * @param imgLogoPath   logo图片获取地址
+     * @param savePath  生成有logo二维码图片存放地址
+     * @param needCompress  是否压缩logo图片
+     * @throws IOException
+     * @throws WriterException
+     */
+    public static void encode(String content, String imgLogoPath, String savePath, boolean needCompress) throws IOException, WriterException {
+
+        QRcodeUtils.createImage(content, imgLogoPath, needCompress);
+        File file = new File(savePath);
+        //判断保存路径文件夹是否存在
+        if(!file.exists() && !file.isDirectory()){
+            file.mkdir();
+        }
+        //使用时间戳命名
+        String strFile = System.currentTimeMillis() + ".jpg";
+        ImageIO.write(QRcodeUtils.createImage(content, imgLogoPath, needCompress), FORMAT_NAME, new File(savePath + "/" + strFile));
+    }
+
+
+    /***
+     * 生成含有logo二维码图片
+     * @param content :内容
+     * @param imgPath   :logo地址
+     * @param needCompress :是否压缩
+     * @return
+     * @throws WriterException
+     * @throws IOException
+     */
+    private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws WriterException, IOException {
+        Hashtable<EncodeHintType, Object> hint = new Hashtable<EncodeHintType, Object>();
+        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        //设置编码
+        hint.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hint.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix =
+                new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hint);
+        //创建图片
+        BufferedImage image =
+                new BufferedImage(bitMatrix.getWidth(), bitMatrix.getHeight(), BufferedImage.TYPE_INT_RGB);
+        for(int i=0; i< bitMatrix.getWidth(); i++){
+            for (int j=0; j<bitMatrix.getHeight(); j++){
+                image.setRGB(i, j, bitMatrix.get(i, j) ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+        if(imgPath == null || imgPath.equals("")){
+            return image;
+        }
+        //插入logo图片
+        QRcodeUtils.insertLogoImage(image, imgPath, needCompress);
+        return image;
+    }
+
+    /****
+     * 插入logo图片
+     * @param bufferedImage :二维码图片
+     * @param imageLogoPath :LOGO图片地址
+     * @param needCompress  :是否压缩
+     * @throws IOException
+     */
+    public static void insertLogoImage(BufferedImage bufferedImage, String imageLogoPath, boolean needCompress) throws IOException {
+        //创建File对象
+        File file = new File(imageLogoPath);
+        if(!file.exists()){
+            System.err.println(imageLogoPath+" 该图片不存在!");
+            return;
+        }
+        Image imageLogo = ImageIO.read(file);
+        int width = imageLogo.getWidth(null);
+        int height = imageLogo.getHeight(null);
+        //压缩Logo
+        if(needCompress){
+            if(width > WIDTH){
+                width =WIDTH;
+            }
+            if (height > HEIGHT){
+                height = HEIGHT;
+            }
+            //开始绘制logo图片
+            Image image = imageLogo.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics graphics = bi.getGraphics();
+            graphics.drawImage(image, 0, 0, null);
+            graphics.dispose();
+            imageLogo = image;
+        }
+        //插入logo
+        Graphics2D graphics2D = bufferedImage.createGraphics();
+        int x = (QRCODE_SIZE - width)/2;
+        int y = (QRCODE_SIZE - height)/2;
+        graphics2D.drawImage(imageLogo, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, height, 6, 6);
+        graphics2D.setStroke(new BasicStroke(3f));
+        graphics2D.draw(shape);
+        graphics2D.dispose();
+
+    }
+
+}

+ 12 - 8
YijiaRestful/src/test/java/com/palatform/yijia/test.java

@@ -4,6 +4,7 @@ import com.platform.yijia.pojo.CustomerElectronicCard;
 import com.platform.yijia.pojo.PayOrder;
 import com.platform.yijia.utils.DESUtils;
 import com.platform.yijia.utils.PosPrinterUtil;
+import com.platform.yijia.utils.QRcodeUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 
 import java.math.BigDecimal;
@@ -16,15 +17,18 @@ public class test {
 
     public static void main(String[] args) {
 
-        Thread_A a1 = new Thread_A("A线程");
-        Thread_B b2 = new Thread_B("B线程");
+        //QRcodeUtils.encode();
+        //QRcodeUtils.imgContainQRcode();
 
-        Thread t1 = new Thread(a1);
-        //t1.setPriority(10);
-        Thread t2 = new Thread(b2);
-        //t2.setPriority(1);
-        t1.start();
-        t2.start();
+//        Thread_A a1 = new Thread_A("A线程");
+//        Thread_B b2 = new Thread_B("B线程");
+//
+//        Thread t1 = new Thread(a1);
+//        //t1.setPriority(10);
+//        Thread t2 = new Thread(b2);
+//        //t2.setPriority(1);
+//        t1.start();
+//        t2.start();
 
 
 //