Java实现带logo的二维码

Java实现带logo的二维码

二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能。好了,我们来一起实现一下吧。

我们实现的二维码是基于QR Code的标准的,QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是Quick Response Code

QR Code:专利公开,支持中文;

QR Code与其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势;

纠错能力:

L级:约可纠错7%的数据码字
M级:约可纠错15%的数据码字
Q级:约可纠错25%的数据码字
H级:约可纠错30%的数据码字

知道了这些硬知识后,我们做一下准备工作,我们需要下载两个jar包,辅助我们开发,这里我放上链接
http://mavenrepository.com/artifact/com.google.zxing/javase
http://mavenrepository.com/artifact/com.google.zxing/core/3.3.2

我们在我们的工程下,新建一个java project 项目就可以了,可以新建三个lib、utils、test三个文件夹;lib存放jar包,utils放我们写的工具类,test用来放我们写的测试类

我们先从不带logo的二维码开始
思路:

1、设置一些二维码的参数;如 字符集、外边距、容错等级

2、生成二维码

好了,我们来实现一下

/**
     * 
     * @param width 二维码的宽
     *            
     * @param height 二维码的高
     *            
     * @param content 二维码的内容
     *            
     */
    public static void createQrCode(int width, int height, String content) {

        // 1、设置二维码的一些参数
        HashMap hints = new HashMap();

        // 1.1设置字符集
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        // 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

        // 1.3设置外边距;(即白色区域)
        hints.put(EncodeHintType.MARGIN, 1);

        // 2、生成二维码

        try {
            // 2.1定义BitMatrix对象
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            // 2.2、设置二维码存放路径,以及二维码的名字
            Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();

            // 2.3、执行生成二维码
            MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

我们来实现一下带logo的二维码
思路:

1、 我们先生成一个LogoConfig的配置类,主要是设置logo边框颜色;logo边框宽度;logo大小

2、 设置一些二维码的参数

3、 生成二维码

4、 生成带logo的二维码

我们来实现一下

LogoConfig类
class LogoConfig {
    // logo默认边框颜色
    public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
    // logo默认边框宽度
    public static final int DEFAULT_BORDER = 2;
    // logo大小默认为照片的1/6
    public static final int DEFAULT_LOGOPART = 6;

    private final int border = DEFAULT_BORDER;
    private final Color borderColor;
    private final int logoPart;

    public LogoConfig() {
        this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
    }

    public LogoConfig(Color borderColor, int logoPart) {
        this.borderColor = borderColor;
        this.logoPart = logoPart;
    }

    public Color getBorderColor() {
        return borderColor;
    }

    public int getBorder() {
        return border;
    }

    public int getLogoPart() {
        return logoPart;
    }
}
生成中间有logo的二维码的工具函数
/**
     * 生成中间有logo的二维码
     * 
     * @param width
     * @param height
     * @param content
     */
    public static void createLogoQrCode(int width, int height, String content) {

        // 1、设置二维码的一些参数
        HashMap hints = new HashMap();

        // 1.1设置字符集
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        // 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

        // 1.3设置外边距;(即白色区域)
        hints.put(EncodeHintType.MARGIN, 1);

        // 2、生成二维码

        try {
            // 2.1定义BitMatrix对象
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            // 2.2、设置二维码存放路径,以及二维码的名字

            // qrFile用来存放生成的二维码图片
            File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");

            // logoFile用来存放带有logo的二维码图片
            File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");

            // 2.3、执行生成二维码
            MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());

            // 2.4在二维码中添加logo
            LogoConfig logoConfig = new LogoConfig();
            addLogo(qrFile, logoFile, logoConfig);
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

添加logo的工具类
/**
     * 
     * @param qrPic 二维码文件路径
     * @param logoPic logo文件路径
     * @param logoConfig 配置类
     */
    private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {

        if (!qrPic.isFile() || !logoPic.isFile()) {
            System.out.println("file not found!");
            System.exit(0);
        }

        try {

            // 1、读取二维码图片,并构建绘图对象
            BufferedImage image = ImageIO.read(qrPic);
            Graphics2D graph = image.createGraphics();

            // 2、读取logo图片
            BufferedImage logo = ImageIO.read(logoPic);

            int widthLogo = image.getWidth() / logoConfig.getLogoPart();
            int heightLogo = image.getHeight() / logoConfig.getLogoPart();

            // 3、计算图片放置的位置
            int x = (image.getWidth() - widthLogo) / 2;
            int y = (image.getHeight() - heightLogo) / 2;

            // 4、绘制图片
            graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
            graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
            graph.setStroke(new BasicStroke(logoConfig.getBorder()));
            graph.setColor(logoConfig.getBorderColor());
            graph.drawRect(x, y, widthLogo, heightLogo);

            graph.dispose();
            
            ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));

        } catch (Exception e) {
            System.out.println(e);

        }
    }

我们写一个测试类来测试一下

@Test
public void test() {
        QrCodeUtils.createQrCode(100, 100, "你好,世界");
        
        QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
        
        QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
        QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\newPic.jpg");
    }

就不再放生成的二维码

我们补充一个读取二维码内容的工具函数

/**
     * 解析二维码
     * 
     * @param codePath 二维码存放全路径 
     *            
     */
    public static void readQrCode(String codePath) {

        try {

            MultiFormatReader formatReader = new MultiFormatReader();

            File QrCode = new File(codePath);

            BufferedImage image = ImageIO.read(QrCode);

            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));

            // 设置二维码的参数
            HashMap hints = new HashMap();

            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

            Result result = formatReader.decode(binaryBitmap, hints);

            // 打印解析结果
            System.out.println(result.toString());

            // 打印二维码格式
            System.out.println(result.getBarcodeFormat());

            // 二维码文本内容
            System.out.println(result.getText());

        } catch (Exception e) {
            System.out.println(e);
        }

    }

注:二维码是有一定纠错能力的,你可以把二维码p成你喜欢的样式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容