生成帶logo的二維碼

一怕敬、淺談二維碼
二維碼能有效的進(jìn)行信息的存儲和傳遞睁蕾,在我們每天的生活中都會用到二維碼。比如微信支付寶的掃碼支付族阅,掃一掃加好友篓跛,手機(jī)掃二維碼授權(quán)pc端登錄等等的廣泛應(yīng)用。那在我們開發(fā)中耘分,如何生成二維碼呢举塔?

二绑警、引入需要的依賴

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.0</version>
</dependency>

三求泰、生成帶logo的二維碼

public class QRCodeLogo {
    private static final int QRCOLOR = 0xFF000000; // 默認(rèn)是黑色
    private static final int BGWHITE = 0xFFFFFFFF; // 背景顏色
    private static final int WIDTH = 400; // 二維碼寬
    private static final int HEIGHT = 400; // 二維碼高

    // 用于設(shè)置QR二維碼參數(shù)
    private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
        private static final long serialVersionUID = 1L;
        {
            put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 設(shè)置QR二維碼的糾錯級別(H為最高級別)具體級別信息
            put(EncodeHintType.CHARACTER_SET, "utf-8");// 設(shè)置編碼方式
        }
    };

    // 生成帶logo的二維碼圖片
    public static void drawLogoQRCode(File logoFile, File codeFile, String qrUrl, String note) {
        try {
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            // 參數(shù)順序分別為:編碼內(nèi)容,編碼類型计盒,生成圖片寬度渴频,生成圖片高度,設(shè)置參數(shù)
            BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

            // 開始利用二維碼數(shù)據(jù)創(chuàng)建Bitmap圖片北启,分別設(shè)為黑(0xFFFFFFFF)白(0xFF000000)兩色
            for (int x = 0; x < WIDTH; x++) {
                for (int y = 0; y < HEIGHT; y++) {
                    image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
                }
            }

            int width = image.getWidth();
            int height = image.getHeight();
            if (Objects.nonNull(logoFile) && logoFile.exists()) {
                // 構(gòu)建繪圖對象
                Graphics2D g = image.createGraphics();
                // 讀取Logo圖片
                BufferedImage logo = ImageIO.read(logoFile);
                // 開始繪制logo圖片
                g.drawImage(logo, width * 2 / 5, height * 2 / 5, width * 2 / 10, height * 2 / 10, null);
                g.dispose();
                logo.flush();
            }

            // 自定義文本描述
            if (note!=null || !"".equals(note)) {
                // 新的圖片卜朗,把帶logo的二維碼下面加上文字
                BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
                Graphics2D outg = outImage.createGraphics();
                // 畫二維碼到新的面板
                outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
                // 畫文字到新的面板
                outg.setColor(Color.BLACK);
                outg.setFont(new Font("楷體", Font.BOLD, 30)); // 字體拔第、字型、字號
                int strWidth = outg.getFontMetrics().stringWidth(note);
                if (strWidth > 399) {
                    // //長度過長就截取前面部分
                    // 長度過長就換行
                    String note1 = note.substring(0, note.length() / 2);
                    String note2 = note.substring(note.length() / 2, note.length());
                    int strWidth1 = outg.getFontMetrics().stringWidth(note1);
                    int strWidth2 = outg.getFontMetrics().stringWidth(note2);
                    outg.drawString(note1, 200 - strWidth1 / 2, height + (outImage.getHeight() - height) / 2 + 12);
                    BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
                    Graphics2D outg2 = outImage2.createGraphics();
                    outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
                    outg2.setColor(Color.BLACK);
                    outg2.setFont(new Font("宋體", Font.BOLD, 30)); // 字體场钉、字型蚊俺、字號
                    outg2.drawString(note2, 200 - strWidth2 / 2,outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight()) / 2 + 5);
                    outg2.dispose();
                    outImage2.flush();
                    outImage = outImage2;
                } else {
                    outg.drawString(note, 200 - strWidth / 2, height + (outImage.getHeight() - height) / 2 + 12); // 畫文字
                }
                outg.dispose();
                outImage.flush();
                image = outImage;
            }

            image.flush();

            ImageIO.write(image, "png", codeFile); // TODO
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、編寫測試類

@Test
    public void test1(){
        //logo圖片保存的位置
        File logoFile = new File("./data/bbb.jpg"); //logo
        //生成的二維碼存放的位置
        File QrCodeFile = new File("./data/aaa.jpg");
        //二維碼攜帶的鏈接或者內(nèi)容
        String url = "https://www.fangxinqian.cn/redirect.html";
        //二維碼的標(biāo)題
        String note = "";
        QRCodeLogo.drawLogoQRCode(logoFile, QrCodeFile, url, note);
    }

五逛万、效果展示
生成的二維碼圖片


image.png

logo圖片


image.png

大家可以把自己簡書的地址放在url里泳猬,把logo換成一個妹子,生成的二維碼就是我上面的效果宇植。然后把圖片發(fā)在朋友圈說給大家推薦一個妹子的微信得封,你的朋友掃完就進(jìn)入了你的簡書主頁,可以騙一波關(guān)注哈哈哈哈V赣簟Cι稀!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闲坎,一起剝皮案震驚了整個濱河市疫粥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箫柳,老刑警劉巖手形,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悯恍,居然都是意外死亡库糠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涮毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞬欧,“玉大人,你說我怎么就攤上這事罢防∷一ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵咒吐,是天一觀的道長野建。 經(jīng)常有香客問我,道長恬叹,這世上最難降的妖魔是什么候生? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮绽昼,結(jié)果婚禮上唯鸭,老公的妹妹穿的比我還像新娘。我一直安慰自己硅确,他們只是感情好目溉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布明肮。 她就那樣靜靜地躺著,像睡著了一般缭付。 火紅的嫁衣襯著肌膚如雪柿估。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天陷猫,我揣著相機(jī)與錄音官份,去河邊找鬼。 笑死烙丛,一個胖子當(dāng)著我的面吹牛舅巷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播河咽,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼钠右,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忘蟹?” 一聲冷哼從身側(cè)響起飒房,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚值,沒想到半個月后狠毯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褥芒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年嚼松,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锰扶。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡献酗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坷牛,到底是詐尸還是另有隱情罕偎,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布京闰,位于F島的核電站颜及,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹂楣。R本人自食惡果不足惜俏站,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捐迫。 院中可真熱鬧乾翔,春花似錦爱葵、人聲如沸施戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞哗。三九已至雷则,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肪笋,已是汗流浹背月劈。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藤乙,地道東北人猜揪。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像坛梁,于是被迫代替她去往敵國和親而姐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355