From 36b10bbab43d215e5515578ec2ccb739c811ec06 Mon Sep 17 00:00:00 2001
From: lizhanwei <Dana_Lee1016@126.com>
Date: 星期五, 10 四月 2020 16:08:15 +0800
Subject: [PATCH] 二维码生成

---
 app/src/main/java/safeluck/drive/evaluation/util/QRCodeUtil.java |  141 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 140 insertions(+), 1 deletions(-)

diff --git a/app/src/main/java/safeluck/drive/evaluation/util/QRCodeUtil.java b/app/src/main/java/safeluck/drive/evaluation/util/QRCodeUtil.java
index 58861b4..69714ef 100644
--- a/app/src/main/java/safeluck/drive/evaluation/util/QRCodeUtil.java
+++ b/app/src/main/java/safeluck/drive/evaluation/util/QRCodeUtil.java
@@ -1,10 +1,24 @@
 package safeluck.drive.evaluation.util;
 
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.text.TextUtils;
+
+import androidx.annotation.Nullable;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+
+import java.util.Hashtable;
+
 /**
  * @ProjectName: DriveJudge
  * @Package: safeluck.drive.evaluation.util
  * @ClassName: QRCodeUtil
- * @Description: java绫讳綔鐢ㄦ弿杩�
+ * @Description: 浜岀淮鐮佺敓鎴愬伐鍏�
  * @Author: 鏉庡崰浼�
  * @CreateDate: 2020-04-10 15:58
  * @UpdateUser: 鏇存柊鑰�
@@ -14,4 +28,129 @@
  */
 
 public class QRCodeUtil {
+
+
+    /**
+     *  鐢熸垚鑷畾涔変簩缁寸爜
+     *
+     * @param content                瀛楃涓插唴瀹�
+     * @param width                  浜岀淮鐮佸搴�
+     * @param height                 浜岀淮鐮侀珮搴�
+     * @param character_set          缂栫爜鏂瑰紡锛堜竴鑸娇鐢║TF-8锛�
+     * @param error_correction_level 瀹归敊鐜� L锛�7% M锛�15% Q锛�25% H锛�35%
+     * @param margin                 绌虹櫧杈硅窛锛堜簩缁寸爜涓庤竟妗嗙殑绌虹櫧鍖哄煙锛�
+     * @param color_black            榛戣壊鑹插潡
+     * @param color_white            鐧借壊鑹插潡
+     * @param logoBitmap             logo鍥剧墖锛堜紶null鏃朵笉娣诲姞logo锛�
+     * @param logoPercent            logo鎵�鍗犵櫨鍒嗘瘮
+     * @param bitmap_black           鐢ㄦ潵浠f浛榛戣壊鑹插潡鐨勫浘鐗囷紙浼爊ull鏃朵笉浠f浛锛�
+     * @return
+     */
+    public static Bitmap createQRCodeBitmap(String content, int width, int height, String character_set, String error_correction_level,
+                                            String margin, int color_black, int color_white, Bitmap logoBitmap, float logoPercent, Bitmap bitmap_black) {
+        // 瀛楃涓插唴瀹瑰垽绌�
+        if (TextUtils.isEmpty(content)) {
+            return null;
+        }
+        // 瀹藉拰楂�>=0
+        if (width < 0 || height < 0) {
+            return null;
+        }
+        try {
+            /** 1.璁剧疆浜岀淮鐮佺浉鍏抽厤缃�,鐢熸垚BitMatrix(浣嶇煩闃�)瀵硅薄 */
+            Hashtable<EncodeHintType, String> hints = new Hashtable<>();
+            // 瀛楃杞爜鏍煎紡璁剧疆
+            if (!TextUtils.isEmpty(character_set)) {
+                hints.put(EncodeHintType.CHARACTER_SET, character_set);
+            }
+            // 瀹归敊鐜囪缃�
+            if (!TextUtils.isEmpty(error_correction_level)) {
+                hints.put(EncodeHintType.ERROR_CORRECTION, error_correction_level);
+            }
+            // 绌虹櫧杈硅窛璁剧疆
+            if (!TextUtils.isEmpty(margin)) {
+                hints.put(EncodeHintType.MARGIN, margin);
+            }
+            /** 2.灏嗛厤缃弬鏁颁紶鍏ュ埌QRCodeWriter鐨別ncode鏂规硶鐢熸垚BitMatrix(浣嶇煩闃�)瀵硅薄 */
+            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+
+            /** 3.鍒涘缓鍍忕礌鏁扮粍,骞舵牴鎹瓸itMatrix(浣嶇煩闃�)瀵硅薄涓烘暟缁勫厓绱犺祴棰滆壊鍊� */
+            if (bitmap_black != null) {
+                //浠庡綋鍓嶄綅鍥炬寜涓�瀹氱殑姣斾緥鍒涘缓涓�涓柊鐨勪綅鍥�
+                bitmap_black = Bitmap.createScaledBitmap(bitmap_black, width, height, false);
+            }
+            int[] pixels = new int[width * height];
+            for (int y = 0; y < height; y++) {
+                for (int x = 0; x < width; x++) {
+                    //bitMatrix.get(x,y)鏂规硶杩斿洖true鏄粦鑹茶壊鍧楋紝false鏄櫧鑹茶壊鍧�
+                    if (bitMatrix.get(x, y)) {// 榛戣壊鑹插潡鍍忕礌璁剧疆
+                        if (bitmap_black != null) {//鍥剧墖涓嶄负null锛屽垯灏嗛粦鑹茶壊鍧楁崲涓烘柊浣嶅浘鐨勫儚绱犮��
+                            pixels[y * width + x] = bitmap_black.getPixel(x, y);
+                        } else {
+                            pixels[y * width + x] = color_black;
+                        }
+                    } else {
+                        pixels[y * width + x] = color_white;// 鐧借壊鑹插潡鍍忕礌璁剧疆
+                    }
+                }
+            }
+
+            /** 4.鍒涘缓Bitmap瀵硅薄,鏍规嵁鍍忕礌鏁扮粍璁剧疆Bitmap姣忎釜鍍忕礌鐐圭殑棰滆壊鍊�,骞惰繑鍥濨itmap瀵硅薄 */
+            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
+
+            /** 5.涓轰簩缁寸爜娣诲姞logo鍥炬爣 */
+            if (logoBitmap != null) {
+                return addLogo(bitmap, logoBitmap, logoPercent);
+            }
+            return bitmap;
+        } catch (WriterException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鍚戜簩缁寸爜涓棿娣诲姞logo鍥剧墖(鍥剧墖鍚堟垚)
+     *
+     * @param srcBitmap   鍘熷浘鐗囷紙鐢熸垚鐨勭畝鍗曚簩缁寸爜鍥剧墖锛�
+     * @param logoBitmap  logo鍥剧墖
+     * @param logoPercent 鐧惧垎姣� (鐢ㄤ簬璋冩暣logo鍥剧墖鍦ㄥ師鍥剧墖涓殑鏄剧ず澶у皬, 鍙栧�艰寖鍥碵0,1] )
+     *                    鍘熷浘鐗囨槸浜岀淮鐮佹椂,寤鸿浣跨敤0.2F,鐧惧垎姣旇繃澶у彲鑳藉鑷翠簩缁寸爜鎵弿澶辫触銆�
+     * @return
+     */
+    @Nullable
+    private static Bitmap addLogo(@Nullable Bitmap srcBitmap, @Nullable Bitmap logoBitmap, float logoPercent) {
+        if (srcBitmap == null) {
+            return null;
+        }
+        if (logoBitmap == null) {
+            return srcBitmap;
+        }
+        //浼犲�间笉鍚堟硶鏃朵娇鐢�0.2F
+        if (logoPercent < 0F || logoPercent > 1F) {
+            logoPercent = 0.2F;
+        }
+
+        /** 1. 鑾峰彇鍘熷浘鐗囧拰Logo鍥剧墖鍚勮嚜鐨勫銆侀珮鍊� */
+        int srcWidth = srcBitmap.getWidth();
+        int srcHeight = srcBitmap.getHeight();
+        int logoWidth = logoBitmap.getWidth();
+        int logoHeight = logoBitmap.getHeight();
+
+        /** 2. 璁$畻鐢诲竷缂╂斁鐨勫楂樻瘮 */
+        float scaleWidth = srcWidth * logoPercent / logoWidth;
+        float scaleHeight = srcHeight * logoPercent / logoHeight;
+
+        /** 3. 浣跨敤Canvas缁樺埗,鍚堟垚鍥剧墖 */
+        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+        canvas.drawBitmap(srcBitmap, 0, 0, null);
+        canvas.scale(scaleWidth, scaleHeight, srcWidth / 2, srcHeight / 2);
+        canvas.drawBitmap(logoBitmap, srcWidth / 2 - logoWidth / 2, srcHeight / 2 - logoHeight / 2, null);
+
+        return bitmap;
+    }
+
+
 }

--
Gitblit v1.8.0