1. 程式人生 > >Android:使用ZXing生成二維碼(支援新增Logo圖案)

Android:使用ZXing生成二維碼(支援新增Logo圖案)

ZXing是谷歌的一個開源庫,可以用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。

首先上效果圖:


1.生成二維碼的工具類

/**
 * 二維碼生成工具類
 */
public class QRCodeUtil {
    /**
     * 生成二維碼Bitmap
     *
     * @param content   內容
     * @param widthPix  圖片寬度
     * @param heightPix 圖片高度
     * @param logoBm    二維碼中心的Logo圖示(可以為null)
     * @param filePath  用於儲存二維碼圖片的檔案路徑
     * @return 生成二維碼及儲存檔案是否成功
     */
    public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {
        try {
            if (content == null || "".equals(content)) {
                return false;
            }

            //配置引數
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //容錯級別
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            //設定空白邊距的寬度
//            hints.put(EncodeHintType.MARGIN, 2); //default is 4

            // 影象資料轉換,使用了矩陣轉換
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
            int[] pixels = new int[widthPix * heightPix];
            // 下面這裡按照二維碼的演算法,逐個生成二維碼的圖片,
            // 兩個for迴圈是圖片橫列掃描的結果
            for (int y = 0; y < heightPix; y++) {
                for (int x = 0; x < widthPix; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * widthPix + x] = 0xff000000;
                    } else {
                        pixels[y * widthPix + x] = 0xffffffff;
                    }
                }
            }

            // 生成二維碼圖片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);

            if (logoBm != null) {
                bitmap = addLogo(bitmap, logoBm);
            }

            //必須使用compress方法將bitmap儲存到檔案中再進行讀取。直接返回的bitmap是沒有任何壓縮的,記憶體消耗巨大!
            return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * 在二維碼中間新增Logo圖案
     */
    private static Bitmap addLogo(Bitmap src, Bitmap logo) {
        if (src == null) {
            return null;
        }

        if (logo == null) {
            return src;
        }

        //獲取圖片的寬高
        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();

        if (srcWidth == 0 || srcHeight == 0) {
            return null;
        }

        if (logoWidth == 0 || logoHeight == 0) {
            return src;
        }

        //logo大小為二維碼整體大小的1/5
        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, 0, 0, null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);

            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
        } catch (Exception e) {
            bitmap = null;
            e.getStackTrace();
        }

        return bitmap;
    }

}
2.在Activity中的使用:
/**
 * 二維碼生成
 */
public class MainActivity extends ActionBarActivity {

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

        //內容
        final EditText contentET = (EditText) findViewById(R.id.create_qr_content);
        //顯示二維碼圖片
        final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv);
        //是否新增Logo
        final CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo);
        Button createQrBtn = (Button) findViewById(R.id.create_qr_btn);

        createQrBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                final String filePath = getFileRoot(MainActivity.this) + File.separator
                        + "qr_" + System.currentTimeMillis() + ".jpg";

                //二維碼圖片較大時,生成圖片、儲存檔案的時間可能較長,因此放在新執行緒中
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800,
                                addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null,
                                filePath);

                        if (success) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
                                }
                            });
                        }
                    }
                }).start();

            }
        });
    }

    //檔案儲存根目錄
    private String getFileRoot(Context context) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File external = context.getExternalFilesDir(null);
            if (external != null) {
                return external.getAbsolutePath();
            }
        }

        return context.getFilesDir().getAbsolutePath();
    }
}

3.本專案中圖片檔案儲存在

context.getExternalFilesDir(null)
目錄之下的。按照官方的api文件,從KitKat開始(Android 4.4),儲存檔案到這個目錄下將不需要SD卡讀寫許可權。但是經過測驗表明,在紅米Note和魅族MX3上(系統均為android 4.4.4),的確不需要許可權;但是在本人的華為P6上(Android 4.4.2),必須宣告許可權才能成功的儲存檔案,即必須在manifest中新增如下內容:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
因此,個人猜測,所謂的不需要許可權是從 Android 4.4.4開始的。


相關推薦

Android使用ZXing生成支援新增Logo圖案

ZXing是谷歌的一個開源庫,可以用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。 首先上效果圖: 1.生成二維碼的工具類 /** * 二維碼生成工具類 */ public class QRCodeUtil { /** * 生成二維碼Bit

Android使用ZXing生成支持加入Logo圖案

over rmi api note sta size argb_8888 reat for循環 ZXing是谷歌的一個開源庫。能夠用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。 首先上效果圖: ZXing相關各種文件官方下載地址:https://g

Java 中使用 google.zxing 快捷生成附工具類原始碼

移動網際網路時代,基於手機端的各種活動掃碼和收付款碼層出不窮;那我們如何在Java中生成自己想要的二維碼呢?下面就來講講在Java開發中使用 google.zxing 生成二維碼。 一般情況下,Java生成二維碼的方式有三種,一種是基於 google.zxing ,是google公司出的;一種

java 使用zxing生成logo和文字說明的

jar包maven地址        <dependency>             <groupId>com.google.zxing</groupId>             <artifactId>core<

java使用Qrcode生成內嵌logo

1、前言 整理一個使用qrcode.jar生成二維碼的測試方法,以備後面學習使用。 2、使用準備 Qrcode.jar 3、demo /* 生成二維碼 */ @RequestMapping(value="/creatQ

生成可改變尺寸顏色

    因為要公司業務中有個要做個用手機掃描書本上二維碼的功能,我要做一個給出版社提供一個可以生成不同尺寸和顏色的二維碼功能    先上效果圖    先選擇顏色前端頁面程式碼我就不展示了    生成效果圖    引入jar <dependency> <

Android平臺生成by google.zxing)

查了大部分的資料,發現android平臺下生成二維碼的例子都是使用谷歌的zxing類,因此仿照某一個帖子編寫了一個demo進行測試,仿照的帖子: https://blog.csdn.net/myname_kk/article/details/77649477 例子中主要用到了BitMatri

AndroidZxing/生成功能

新年已過,一切恢復真正常,新的一年給自己幾句指引: 光努力還不行,方向很重要。 總是想著最壞的結果,就會讓人失去改變的勇氣。 你當然有權利選擇自己的人生--但只有在你真正強大後,逆行的阻力才會降到最小。 never say never. 下面開始記錄二維碼使用過程

Android平臺利用Zxing生成與解析圖片中的

轉載請註明http://blog.csdn.net/houkai6/article/details/47102733 1. 生成二維碼 public final class EncodingHandler { private static final int BLACK

Android 使用Zxing實現生成,掃描

在專案中要使用到二維碼的相關內容,百度(原諒我還在用)之後得知一半都是使用Google的開源庫 Zxing,但是網上多半的使用教程都是比較早的,這裡給出我總結的一些基礎程式碼和使用規則: 首先要一定要先去官網看看: 1. 如何匯入 如果是使用andro

zxing生成

fault awt .com void auth args dom systems import <dependency> <groupId>com.google.zxing</groupId> <artifact

zxing生成設置邊框顏色

嘗試 edi osi 循環 span static right 開始 top 真是研究了很久很久,滿滿的淚啊 zxing生成二維碼,默認是可以增加空白邊框的,但是並沒有說設置邊框顏色的屬性。 其中增加空白邊框的屬性的一句話是: Map hints = new Ha

WPF調用zxing生成

大小 pac xaml returns pri 進行 writer 創建 idt 1.登錄http://zxingnet.codeplex.com/,下載對應.net版本的zxing庫 2.引入zxing.dll 3.新建界面控件 using System; using

java學習-zxing生成矩陣的簡單例子

map obj 基於 The output 圖片 .get imageio sts 這個例子需要使用google的開源項目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下載jar文件 也可使用maven添加依賴 <de

Android 把url生成並貼到給定的底圖上

主要是用到了com.google.zxing jar包生成二維碼的功能,這個jar包需要自己接下載  直接上程式碼 public static Bitmap CreateBinaryCodeImageByUrl(String url,Bitmap bottomImg,int dra

zxing生成以流式傳到頁面

@RequestMapping(“/makeQrCode”) public void madeQrCode(HttpServletResponse res,String content,Integer width,Integer height) throws IOException{

生成java後端

需要引入2個jar包: <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <versi

Zxing 生成

首先新增依賴 implementation ‘cn.bingoogolapple:bga-qrcode-zxing:1.2.5’ 新增許可權 佈局 MainActivity package com.lll.zxingsc; import android.Manifes

使用zxing生成工具類

public class QRCodeUtils { /** * 建立二維碼(有白邊) * * @param string * @return */ public static Bitmap c

SpringBoot 使用 zxing 生成 返回Base64編碼

前置知識 生成二維碼目前的技術目前有兩大類:QRCode 和 Zxing QRCode 是日本原生的二維碼生成技術,目前只有 0.5Beta 版且不能通過maven等構件工具引入 Zxing 是google 對二維碼生成技術的包裝,提供給Android系統用,不過也可以