Zxing生成含有LOGO二維碼

Zxing生成二維碼含有LOGO


package com.example.mvptest;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

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 com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.security.spec.EncodedKeySpec;
import java.util.Hashtable;

public class MainActivity extends AppCompatActivity {

    private static final int QR_WIDTH = 1000;
    private static final int QR_HEIGHT = 1000;
    private static  int IMAGE_HALFWIDTH = 800;
    private ImageView targetImager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        targetImager = (ImageView) findViewById(R.id.iv_QRImage);
        String url = "我是^(* ̄(oo) ̄)^,你呢?afasdfdsa";
        createQRImage(url);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
        Bitmap codeWithLogo = createQRCodeWithLogo(url, bitmap);
        targetImager.setImageBitmap(codeWithLogo);
    }
        /**
         * 生成帶logo的二維碼,默認二維碼的大小爲500,logo爲二維碼的1/5
         *
         * @param text 需要生成二維碼的文字、網址等
         * @param mBitmap logo文件
         * @return bitmap
         */
        public static Bitmap createQRCodeWithLogo(String text, Bitmap mBitmap) {
            return createQRCodeWithLogo(text,500,mBitmap);
        }
        /**
         * 生成帶logo的二維碼,logo默認爲二維碼的1/5
         *
         * @param text 需要生成二維碼的文字、網址等
         * @param size 需要生成二維碼的大小()
         * @param mBitmap logo文件
         * @return bitmap
         */
        public static Bitmap createQRCodeWithLogo(String text, int size, Bitmap mBitmap) {
            try {
                IMAGE_HALFWIDTH = size/10;
                Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            /*
             * 設置容錯級別,默認爲ErrorCorrectionLevel.L
             * 因爲中間加入logo所以建議你把容錯級別調至H,否則可能會出現識別不了
             */
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                        BarcodeFormat.QR_CODE, size, size, hints);

                int width = bitMatrix.getWidth();//矩陣高度
                int height = bitMatrix.getHeight();//矩陣寬度
                int halfW = width / 2;
                int halfH = height / 2;

                Matrix m = new Matrix();
                float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();
                float sy = (float) 2 * IMAGE_HALFWIDTH
                        / mBitmap.getHeight();
                m.setScale(sx, sy);
                //設置縮放信息
                //將logo圖片按martix設置的信息縮放
                mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,
                        mBitmap.getWidth(), mBitmap.getHeight(), m, false);

                int[] pixels = new int[size * size];
                for (int y = 0; y < size; y++) {
                    for (int x = 0; x < size; x++) {
                        if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
                                && y > halfH - IMAGE_HALFWIDTH
                                && y < halfH + IMAGE_HALFWIDTH) {
                            //該位置用於存放圖片信息
                            //記錄圖片每個像素信息
                            pixels[y * width + x] = mBitmap.getPixel(x - halfW
                                    + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
                        } else {
                            if (bitMatrix.get(x, y)) {
                                pixels[y * size + x] = 0xff000000;
                            } else {
                                pixels[y * size + x] = 0xffffffff;
                            }
                        }
                    }
                }
                Bitmap bitmap = Bitmap.createBitmap(size, size,
                        Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
                return null;
            }
    }

    private void createQRImage(String url) {

        try {
            if (url == null || "".equals(url) || url.length() < 1) {
                return;
            }
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

            //圖像數據轉換,使用矩陣轉換
            BitMatrix bitMatrix = null;
            bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
            int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
            //下面這裏按照二維碼的算法,逐個生成二維碼的圖片,
            //兩個for循環是圖片橫列掃描的結果
            for (int y = 0; y < QR_HEIGHT; y++) {
                for (int x = 0; x < QR_WIDTH; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * QR_WIDTH + x] = 0xff000000;
                    } else {
                        pixels[y * QR_WIDTH + x] = 0xffffffff;
                    }
                }
            }
            //生成二維碼圖片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
            //顯示到一個ImageView上面
            targetImager.setImageBitmap(bitmap);
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章