用zxing生成沒有白邊的條形碼

參考:zxing設(shè)置條碼兩邊空白(EncodeHintType.MARGIN)無效的分析

閱讀上方源碼解析后得到思路:
白邊的大小: int leftPadding = (outputWidth - (inputWidth * multiple)) / 2;
要讓leftpadding為0,需要讓傳入的width和code.length是整數(shù)倍的關(guān)系,
那么傳入expectWidth和maxWidth,計(jì)算得到一個(gè)沒有白邊的寬度. 用這個(gè)寬度去生成條形碼,一定沒有白邊
高度不影響白邊生成,隨意傳入.

封裝后的代碼:

/** @param context 盡量用activity,以防使用過屏幕適配工具類后application context 和activity里的desplaymetric里的dpidensity不一致
     @param expectWidth 期望的寬度
     @param maxWidth 最大允許寬度
     * @param contents 生成條形碼的內(nèi)容
     * @param height
     * @return
     */
    public static Bitmap getBarCodeWithoutPadding(Context context, int expectWidth,int maxWidth,int height,String contents){
       
        int width = CommonUtils.dp2px(context, expectWidth);
        int widthMax = CommonUtils.dp2px(context, maxWidth);
        int heightExpect = CommonUtils.dp2px(context, height);
        
        int realWidth = getBarCodeNoPaddingWidth(width,contents,widthMax);

        return syncEncodeBarcode(contents, realWidth, heightExpect,0);
    }

計(jì)算生成無白邊的寬度:

private static int getBarCodeNoPaddingWidth(int expectWidth,String contents,int maxWidth){
        boolean[] code = new Code128Writer(). encode(contents);

        int inputWidth = code.length;
        XLogUtil.d("code:"+contents+" code.length:"+inputWidth +" expectWidth:"+expectWidth+" maxWidth:"+maxWidth);

        //code:210000000000000082 code.length:134 expectWidth:397 maxWidth:435
        // Add quiet zone on both sides.
        //int fullWidth = inputWidth + 0;

        double outputWidth = (double) Math.max(expectWidth, inputWidth);
        double multiple = outputWidth / inputWidth;
        XLogUtil.d("multiple:"+multiple);
        //multiple:2.962686567164179

        //優(yōu)先取大的
        int returnVal =0;
        int ceil = (int) Math.ceil(multiple);
        if(inputWidth * ceil <= maxWidth){
            returnVal =  inputWidth * ceil;
        }else {
            int floor = (int) Math.floor(multiple);
            returnVal =  inputWidth * floor;
        }

        XLogUtil.d("returnVal:"+returnVal);
        return returnVal;
    }

生成條形碼(code128碼)
代碼來自:BGAQRCode-Android
注意內(nèi)部需要: hints.put(EncodeHintType.MARGIN, 0);

/**
     * 同步創(chuàng)建條形碼圖片
     *
     * @param content  要生成條形碼包含的內(nèi)容
     * @param width    條形碼的寬度憾赁,單位px
     * @param height   條形碼的高度刹勃,單位px
     * @param textSize 字體大小木柬,單位px钧惧,如果等于0則不在底部繪制文字
     * @return 返回生成條形的位圖
     *
     * 白邊問題:
     *   https://blog.csdn.net/sunshinwong/article/details/50156017
     *已知高度,計(jì)算寬度:
     *
     */
    private static Bitmap syncEncodeBarcode(String content, int width, int height, int textSize) {
        if (TextUtils.isEmpty(content)) {
            return null;
        }
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.MARGIN, 0);

        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, width, height, hints);
            int[] pixels = new int[width * height];
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * width + x] = 0xff000000;
                    } else {
                        pixels[y * width + x] = 0xffffffff;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            if (textSize > 0) {
                bitmap = showContent(bitmap, content, textSize);
            }
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

使用時(shí)布局:

注意:

  • 文字盡量自己用textview顯示,方便更改字體等效果
  • 內(nèi)外布局采用android:layout_width="wrap_content" 不要采用固定寬度,然后再設(shè)置fitXY,會(huì)影響識(shí)別效果.
  • 外部周邊不要有灰色邊框之類的,以免影響識(shí)別
<LinearLayout
                android:paddingTop="10dp"
                android:orientation="vertical"
                android:layout_centerInParent="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            <ImageView
                    android:id="@+id/bind_barcode_iv"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="72dp" />
            <TextView
                    android:id="@+id/bind_code_tv"
                    android:layout_gravity="center_horizontal"
                    android:text="14522646685845122554"
                    android:textSize="13sp"
                    android:textColor="@color/common_color_666666"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
        </LinearLayout>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惊科,隨后出現(xiàn)的幾起案子康栈,更是在濱河造成了極大的恐慌述吸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼劈,死亡現(xiàn)場(chǎng)離奇詭異驻啤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荐吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門骑冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赊瞬,“玉大人,你說我怎么就攤上這事贼涩∩” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵磁携,是天一觀的道長(zhǎng)褒侧。 經(jīng)常有香客問我,道長(zhǎng)谊迄,這世上最難降的妖魔是什么闷供? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮统诺,結(jié)果婚禮上歪脏,老公的妹妹穿的比我還像新娘。我一直安慰自己粮呢,他們只是感情好婿失,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啄寡,像睡著了一般豪硅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺物,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天懒浮,我揣著相機(jī)與錄音,去河邊找鬼识藤。 笑死砚著,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痴昧。 我是一名探鬼主播稽穆,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赶撰!你這毒婦竟也來了舌镶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤扣囊,失蹤者是張志新(化名)和其女友劉穎乎折,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵歇,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂澄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惕虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟冲。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磨镶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出健提,到底是詐尸還是另有隱情琳猫,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布私痹,位于F島的核電站脐嫂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏紊遵。R本人自食惡果不足惜账千,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暗膜。 院中可真熱鬧匀奏,春花似錦、人聲如沸学搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瑞佩。三九已至聚磺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉凌,已是汗流浹背咧最。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留御雕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓滥搭,卻偏偏與公主長(zhǎng)得像酸纲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑟匆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5闽坡? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,474評(píng)論 1 45
  • 課前玩游戲“先讀再感” 學(xué)生回答,老師引導(dǎo)后冕象,同桌互訴情節(jié) 分享感受 老師發(fā)現(xiàn)你們都是圍繞3個(gè)人進(jìn)行感受的 他們給...
    追風(fēng)箏的鳥兒閱讀 206評(píng)論 0 0
  • “蘇藍(lán)代承,蘇藍(lán)……”徐曼玲偷偷地扯著蘇藍(lán)的衣角。 “看來渐扮,有人在開會(huì)的時(shí)候心不在焉论悴!”夏新禹冷冷地看著蘇藍(lán)掖棉。 “對(duì)不...
    蚊小芝閱讀 467評(píng)論 0 1
  • 前天在朋友店里看到一個(gè)老太太帶著孩子買東西察纯,七八種餅干帕棉,每個(gè)都要嘗一下,最后就買了五塊錢的饼记。 走的時(shí)候小孩嘴里的東...
    葒樺閱讀 164評(píng)論 0 2