Android進(jìn)階 - 二維碼生成(花式效果)

摘要:

本篇是對筆者上一篇文章 Android進(jìn)階 - 二維碼生成 的一點(diǎn)補(bǔ)充。

效果圖:

QRCode.png

工具類:

本篇不再重復(fù)說原理性的東西了。需要的朋友可以直接Copy使用仓坞。

注:使用該工具類需要引入ZXing庫或jar包(導(dǎo)入方法可查看上篇文章 Android進(jìn)階 - 二維碼生成 )。

/**
 * @ClassName: QRCodeUtil
 * @Description: 二維碼工具類
 * @Author Wangnan
 * @Date 2017/2/10
 */

public class QRCodeUtil {

    /**
     * 創(chuàng)建二維碼位圖
     *
     * @param content 字符串內(nèi)容
     * @param size 位圖寬&高(單位:px)
     * @return
     */
    @Nullable
    public static Bitmap createQRCodeBitmap(@Nullable String content, int size){
        return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, null, null, 0F);
    }

    /**
     * 創(chuàng)建二維碼位圖 (自定義黑、白色塊顏色)
     *
     * @param content 字符串內(nèi)容
     * @param size 位圖寬&高(單位:px)
     * @param color_black 黑色色塊的自定義顏色值
     * @param color_white 白色色塊的自定義顏色值
     * @return
     */
    @Nullable
    public static Bitmap createQRCodeBitmap(@Nullable String content, int size, @ColorInt int color_black, @ColorInt int color_white){
        return createQRCodeBitmap(content, size, "UTF-8", "H", "4", color_black, color_white, null, null, 0F);
    }

    /**
     * 創(chuàng)建二維碼位圖 (帶Logo小圖片)
     *
     * @param content 字符串內(nèi)容
     * @param size 位圖寬&高(單位:px)
     * @param logoBitmap logo圖片
     * @param logoPercent logo小圖片在二維碼圖片中的占比大小,范圍[0F,1F]嗤形。超出范圍->默認(rèn)使用0.2F
     * @return
     */
    @Nullable
    public static Bitmap createQRCodeBitmap(String content, int size, @Nullable Bitmap logoBitmap, float logoPercent){
        return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, null, logoBitmap, logoPercent);
    }

    /**
     * 創(chuàng)建二維碼位圖 (Bitmap顏色代替黑色) 注意!!!注意!!!注意!!! 選用的Bitmap圖片一定不能有白色色塊,否則會識別不出來!!!
     *
     * @param content 字符串內(nèi)容
     * @param size 位圖寬&高(單位:px)
     * @param targetBitmap 目標(biāo)圖片 (如果targetBitmap != null, 黑色色塊將會被該圖片像素色值替代)
     * @return
     */
    @Nullable
    public static Bitmap createQRCodeBitmap(String content, int size, Bitmap targetBitmap){
        return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, targetBitmap, null, 0F);
    }

    /**
     * 創(chuàng)建二維碼位圖 (支持自定義配置和自定義樣式)
     *
     * @param content 字符串內(nèi)容
     * @param size 位圖寬&高(單位:px)
     * @param character_set 字符集/字符轉(zhuǎn)碼格式 (支持格式:{@link CharacterSetECI })。傳null時(shí),zxing源碼默認(rèn)使用 "ISO-8859-1"
     * @param error_correction 容錯(cuò)級別 (支持級別:{@link ErrorCorrectionLevel })弧圆。傳null時(shí),zxing源碼默認(rèn)使用 "L"
     * @param margin 空白邊距 (可修改,要求:整型且>=0), 傳null時(shí),zxing源碼默認(rèn)使用"4"赋兵。
     * @param color_black 黑色色塊的自定義顏色值
     * @param color_white 白色色塊的自定義顏色值
     * @param targetBitmap 目標(biāo)圖片 (如果targetBitmap != null, 黑色色塊將會被該圖片像素色值替代)
     * @param logoBitmap logo小圖片
     * @param logoPercent logo小圖片在二維碼圖片中的占比大小,范圍[0F,1F],超出范圍->默認(rèn)使用0.2F笔咽。
     * @return
     */
    @Nullable
    public static Bitmap createQRCodeBitmap(@Nullable String content, int size,
                                            @Nullable String character_set, @Nullable String error_correction, @Nullable String margin,
                                            @ColorInt int color_black, @ColorInt int color_white, @Nullable Bitmap targetBitmap,
                                            @Nullable Bitmap logoBitmap, float logoPercent){

        /** 1.參數(shù)合法性判斷 */
        if(TextUtils.isEmpty(content)){ // 字符串內(nèi)容判空
            return null;
        }

        if(size <= 0){ // 寬&高都需要>0
            return null;
        }

        try {
            /** 2.設(shè)置二維碼相關(guān)配置,生成BitMatrix(位矩陣)對象 */
            Hashtable<EncodeHintType, String> hints = new Hashtable<>();

            if(!TextUtils.isEmpty(character_set)) {
                hints.put(EncodeHintType.CHARACTER_SET, character_set); // 字符轉(zhuǎn)碼格式設(shè)置
            }

            if(!TextUtils.isEmpty(error_correction)){
                hints.put(EncodeHintType.ERROR_CORRECTION, error_correction); // 容錯(cuò)級別設(shè)置
            }

            if(!TextUtils.isEmpty(margin)){
                hints.put(EncodeHintType.MARGIN, margin); // 空白邊距設(shè)置
            }
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);

            /** 3.根據(jù)BitMatrix(位矩陣)對象為數(shù)組元素賦顏色值 */
            if(targetBitmap != null){
                targetBitmap = Bitmap.createScaledBitmap(targetBitmap, size, size, false);
            }
            int[] pixels = new int[size * size];
            for(int y = 0; y < size; y++){
                for(int x = 0; x < size; x++){
                    if(bitMatrix.get(x, y)){ // 黑色色塊像素設(shè)置
                        if(targetBitmap != null) {
                            pixels[y * size + x] = targetBitmap.getPixel(x, y);
                        } else {
                            pixels[y * size + x] = color_black;
                        }
                    } else { // 白色色塊像素設(shè)置
                        pixels[y * size + x] = color_white;
                    }
                }
            }

            /** 4.創(chuàng)建Bitmap對象,根據(jù)像素?cái)?shù)組設(shè)置Bitmap每個(gè)像素點(diǎn)的顏色值,之后返回Bitmap對象 */
            Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, size, 0, 0, size, size);

            /** 5.為二維碼添加logo小圖標(biāo) */
            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 百分比 (用于調(diào)整logo圖片在原圖片中的顯示大小, 取值范圍[0,1], 傳值不合法時(shí)使用0.2F)
     *                    原圖片是二維碼時(shí),建議使用0.2F,百分比過大可能導(dǎo)致二維碼掃描失敗。
     * @return
     */
    @Nullable
    private static Bitmap addLogo(@Nullable Bitmap srcBitmap, @Nullable Bitmap logoBitmap, float logoPercent){

        /** 1. 參數(shù)合法性判斷 */
        if(srcBitmap == null){
            return null;
        }

        if(logoBitmap == null){
            return srcBitmap;
        }

        if(logoPercent < 0F || logoPercent > 1F){
            logoPercent = 0.2F;
        }

        /** 2. 獲取原圖片和Logo圖片各自的寬霹期、高值 */
        int srcWidth = srcBitmap.getWidth();
        int srcHeight = srcBitmap.getHeight();
        int logoWidth = logoBitmap.getWidth();
        int logoHeight = logoBitmap.getHeight();

        /** 3. 計(jì)算畫布縮放的寬高比 */
        float scaleWidth = srcWidth * logoPercent / logoWidth;
        float scaleHeight = srcHeight * logoPercent / logoHeight;

        /** 4. 使用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;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叶组,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子历造,更是在濱河造成了極大的恐慌甩十,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吭产,死亡現(xiàn)場離奇詭異侣监,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臣淤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門橄霉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荒典,你說我怎么就攤上這事酪劫。” “怎么了寺董?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵覆糟,是天一觀的道長。 經(jīng)常有香客問我遮咖,道長滩字,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任御吞,我火速辦了婚禮麦箍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陶珠。我一直安慰自己挟裂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布揍诽。 她就那樣靜靜地躺著诀蓉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暑脆。 梳的紋絲不亂的頭發(fā)上渠啤,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音添吗,去河邊找鬼沥曹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妓美。 我是一名探鬼主播僵腺,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壶栋!你這毒婦竟也來了想邦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤委刘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹰椒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锡移,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年漆际,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淆珊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奸汇,死狀恐怖施符,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擂找,我是刑警寧澤戳吝,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站贯涎,受9級特大地震影響听哭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塘雳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一陆盘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败明,春花似錦隘马、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盈包,卻和暖如春沸呐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呢燥。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工崭添, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叛氨。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓呼渣,卻偏偏與公主長得像棘伴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子屁置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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