Android二維碼的基礎(chǔ)使用(一):利用Zxing生成自定義二維碼

概述

二維碼的應(yīng)用已經(jīng)可以說是非常廣泛了熊昌,那么如何在當(dāng)前的app項目中生成自定義二維碼,本文對采用Google開源庫Zxing去生成二維碼的流程進(jìn)行簡單說明裕膀。

系列文章:

Android二維碼的基礎(chǔ)使用(一):利用Zxing生成自定義二維碼
Android二維碼的基礎(chǔ)使用(二):保存和分享
Android二維碼的基礎(chǔ)使用(三):二維碼掃描Demo實現(xiàn)

使用

1. 引入jar包

build.gradle文件中引入jar包纹因。

implementation 'com.google.zxing:core:3.3.0'

2. 基本使用

生成一個二維碼主要包含如下幾個步驟:

  1. 設(shè)置二維碼的配置,如字符轉(zhuǎn)碼格式杠茬。容錯率以及空白邊距等等參數(shù)遂填。
  2. 通過QRWriter生成位矩陣BitMatrix對象
  3. 創(chuàng)建像素數(shù)組,并根據(jù)位矩陣對象逐項賦值顏色澈蝙。
  4. 根據(jù)像素數(shù)組創(chuàng)建bitmap對象生成二維碼圖片。

示例代碼如下:

    /**
     * 生成簡單二維碼
     *
     * @param content                字符串內(nèi)容
     * @param width                  二維碼寬度
     * @param height                 二維碼高度
     * @param characterSet          編碼方式(一般使用UTF-8)
     * @param errorCorrectionLevel 容錯率 L:7% M:15% Q:25% H:35%
     * @param margin                 空白邊距(二維碼與邊框的空白區(qū)域)
     * @param colorBlack            黑色色塊
     * @param colorWhite            白色色塊
     * @return BitMap
     */
    fun createQRCodeBitmap(
        content: String?, width: Int, height: Int,
        characterSet: String?, errorCorrectionLevel: String?,
        margin: String?, colorBlack: Int, colorWhite: Int
    ): Bitmap? {
        // 字符串內(nèi)容判空
        if (TextUtils.isEmpty(content)) {
            return null
        }
        // 寬和高>=0
        if (width < 0 || height < 0) {
            return null
        }
        return try {
            /** 1.設(shè)置二維碼相關(guān)配置  */
            val hints =
                Hashtable<EncodeHintType, String?>()
            // 字符轉(zhuǎn)碼格式設(shè)置
            if (!TextUtils.isEmpty(characterSet)) {
                hints[EncodeHintType.CHARACTER_SET] = characterSet
            }
            // 容錯率設(shè)置
            if (!TextUtils.isEmpty(errorCorrectionLevel)) {
                hints[EncodeHintType.ERROR_CORRECTION] = errorCorrectionLevel
            }
            // 空白邊距設(shè)置
            if (!TextUtils.isEmpty(margin)) {
                hints[EncodeHintType.MARGIN] = margin
            }
            /** 2.將配置參數(shù)傳入到QRCodeWriter的encode方法生成BitMatrix(位矩陣)對象  */
            val bitMatrix =
                QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)

            /** 3.創(chuàng)建像素數(shù)組,并根據(jù)BitMatrix(位矩陣)對象為數(shù)組元素賦顏色值  */
            val pixels = IntArray(width * height)
            for (y in 0 until height) {
                for (x in 0 until width) {
                    //bitMatrix.get(x,y)方法返回true是黑色色塊撵幽,false是白色色塊
                    if (bitMatrix[x, y]) {
                        pixels[y * width + x] = colorBlack //黑色色塊像素設(shè)置灯荧,可以通過傳入不同的顏色實現(xiàn)彩色二維碼,例如Color.argb(1,55,206,141)等設(shè)置不同的顏色盐杂。
                    } else {
                        pixels[y * width + x] = colorWhite // 白色色塊像素設(shè)置
                    }
                }
            }
            /** 4.創(chuàng)建Bitmap對象,根據(jù)像素數(shù)組設(shè)置Bitmap每個像素點的顏色值,并返回Bitmap對象  */
            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height)
            bitmap
        } catch (e: WriterException) {
            e.printStackTrace()
            null
        }
        //調(diào)用示例代碼
//        imageView.setImageBitmap(QRCodeBitmap.newInstance().createQRCodeBitmap("test",80,80,
//                "UTF-8","L","1", Color.BLACK,Color.WHITE));
    }

參數(shù)說明:

  • characterSet:編碼方式逗载,通常采用UTF-8,格式不對可能會導(dǎo)致亂碼链烈。
  • errorCorrectionLevel:容錯率厉斟,即使二維碼破損了一部分也能掃描的程度,容錯率越高强衡,二維碼能存儲的內(nèi)容也會隨之變小擦秽。主要等級分為:L:7% M:15% Q:25% H:35%。
  • 顏色:顏色對應(yīng)二維碼生成時的顏色顯示漩勤,可以通過設(shè)置不用的顏色來實現(xiàn)彩色二維碼感挥,如Color.argb(1,55,206,141)

3. 二維碼嵌入logo

常見的二維碼中還可以嵌入logo,添加logo就是圖片合成越败,將logo圖片以一定比例合成在原二維碼圖片上触幼,即將logo圖片直接拼接在二維碼的中心位置,示例代碼如下:

 /***
     * 為二維碼添加logo
     *
     * @param srcBitmap 二維碼圖片
     * @param logoBitmap logo圖片
     * @param percent logo比例
     * @return 生成的最終的圖片
     */
    fun addLogo(srcBitmap: Bitmap?, logoBitmap: Bitmap?, percent: Float): Bitmap? {
        //判斷參數(shù)是否正確
        if (srcBitmap == null)
            return null
        if (logoBitmap == null)
            return srcBitmap
        //輸入logo圖片比例錯誤自動糾正為默認(rèn)的0.2f
        var logoPercent = percent
        if (percent < 0 || percent > 1)
            logoPercent = 0.2f

        //分別獲取bitmap圖片的大小
        var sHeight = srcBitmap.height
        var sWidth = srcBitmap.width
        var lHeight = logoBitmap.height
        var lWidth = logoBitmap.width

        //獲取縮放比例
        var scareWidth = sHeight * logoPercent / lWidth
        var scareHeight = sWidth * logoPercent / lHeight

        //使用canvas重新繪制bitmap
        var bitmap = Bitmap.createBitmap(sWidth, sHeight, Bitmap.Config.ARGB_8888)
        var canvas = Canvas(bitmap)
        canvas.drawBitmap(srcBitmap, 0f, 0f, null)
        canvas.scale(
            scareWidth,
            scareHeight,
            (sWidth / 2).toFloat(),
            (sHeight / 2).toFloat()
        )   //設(shè)置縮放中心基點
        canvas.drawBitmap(
            logoBitmap,
            (sWidth/2 - lWidth / 2).toFloat(),
            (sHeight/2 - lHeight / 2).toFloat(),
            null
        )
        return bitmap
    }

4. 添加圖片展示效果

和生成不同顏色的二維碼本質(zhì)相同究飞,其實現(xiàn)的基本邏輯就是在繪制二維碼的時候使用圖片的像素塊去取代當(dāng)前二維碼的非白色的像素塊置谦,其他的步驟和基本生成二維碼的流程沒有區(qū)別堂鲤,部分示例代碼如下:

//bitmapOther為傳入的需要展示的圖片效果的圖片,類型為bitmap
//先根據(jù)二維碼的大小生成等大的bitmap媒峡,方便直接獲取對應(yīng)的像素塊
var bitmapExtra: Bitmap? = null
if (bitmapOther != null) {
    bitmapExtra = Bitmap.createScaledBitmap(bitmapOther, width, height, false)
}

...

if (bitMatrix.get(x, y)) {// 像素塊設(shè)置
    if (bitmapExtra != null) {
    //圖片不為null瘟栖,則將黑色色塊換為新位圖的像素。
        pixels[y * width + x] = bitmapExtra.getPixel(x, y);
    } else {
    //無圖片時默認(rèn)仍然為輸入顏色像素塊
        pixels[y * width + x] = colorBlack;
    }
} else {
    pixels[y * width + x] = colorWhite;// 白色色塊像素設(shè)置
}

如果圖片的大部分顏色都比較淺丝蹭,使用上述方法會影響到掃描效果慢宗,如果需要使用二維碼上附加圖片效果,盡量使用顏色較深的圖片奔穿。

后續(xù)文章

Android二維碼的基礎(chǔ)使用(二):保存和分享

參考文章及Demo

官方地址

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镜沽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贱田,更是在濱河造成了極大的恐慌缅茉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件男摧,死亡現(xiàn)場離奇詭異蔬墩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耗拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拇颅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乔询,你說我怎么就攤上這事樟插。” “怎么了竿刁?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵黄锤,是天一觀的道長。 經(jīng)常有香客問我食拜,道長鸵熟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任负甸,我火速辦了婚禮流强,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呻待。我一直安慰自己煮盼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布带污。 她就那樣靜靜地躺著僵控,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鱼冀。 梳的紋絲不亂的頭發(fā)上报破,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天悠就,我揣著相機(jī)與錄音,去河邊找鬼充易。 笑死梗脾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盹靴。 我是一名探鬼主播炸茧,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稿静!你這毒婦竟也來了梭冠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤改备,失蹤者是張志新(化名)和其女友劉穎控漠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬钳,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡盐捷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了默勾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碉渡。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖母剥,靈堂內(nèi)的尸體忽然破棺而出爆价,到底是詐尸還是另有隱情,我是刑警寧澤媳搪,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站骤宣,受9級特大地震影響秦爆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憔披,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一等限、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芬膝,春花似錦望门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癣缅,卻和暖如春厨剪,著一層夾襖步出監(jiān)牢的瞬間哄酝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工祷膳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留陶衅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓直晨,卻偏偏與公主長得像搀军,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勇皇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容