android使用zxing生成二维码及带logo的二维码_Kyle雨檬的博客-程序员ITS304_zxing 添加logo

技术标签: android使用zxing生成二维码  android工具类  android使用zxing生成带logo的二维码  

先来几张效果图:


接下来就是实现步骤:

1、添加zxing的依赖包

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

2、生成二维码的工具类:

package com.huicaiju.app.base.util;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
 * 二维码生成和解析工具类
 *
 * Created by ky on 2018/4/19.
 *
 */
public class QrCodeUtil {

    private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小

    /**
     * 生成二维码,默认大小为500*500
     *
     * @param text 需要生成二维码的文字、网址等
     * @return bitmap
     */
    public static Bitmap createQRCode(String text) {
        return createQRCode(text, 500);
    }
    /**
     * 生成二维码
     *
     * @param text 需要生成二维码的文字、网址等
     * @param size 需要生成二维码的大小()
     * @return bitmap
     */
    public static Bitmap createQRCode(String text, int size) {
        try {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                    BarcodeFormat.QR_CODE, size, size, hints);
            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)) {
                        pixels[y * size + x] = 0xff000000;
                    } else {
                        pixels[y * size + x] = 0xffffffff;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(size, size,
                    Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 生成带logo的二维码,默认二维码的大小为500logo为二维码的1/5
     *
     * @param text    需要生成二维码的文字、网址等
     * @param mBitmap logo文件
     * @return bitmap
     */
    public static Bitmap createQRCodeWithLogo(String text, Bitmap mBitmap) {
        return createQRCodeWithLogo(text, 500, mBitmap);
    }

    /**
     * 生成带logo的二维码,logo默认为二维码的1/5
     *
     * @param text    需要生成二维码的文字、网址等
     * @param size    需要生成二维码的大小()
     * @param mBitmap logo文件
     * @return bitmap
     */
    public static Bitmap createQRCodeWithLogo(String text, int size, Bitmap mBitmap) {
        try {
            IMAGE_HALFWIDTH = size / 10;
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            /*
             * 设置容错级别,默认为ErrorCorrectionLevel.L
             * 因为中间加入logo所以建议你把容错级别调至H,否则可能会出现识别不了
             */
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            //设置空白边距的宽度
            hints.put(EncodeHintType.MARGIN, 1); //default is 4
            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                    BarcodeFormat.QR_CODE, size, size, hints);

            int width = bitMatrix.getWidth();//矩阵高度
            int height = bitMatrix.getHeight();//矩阵宽度
            int halfW = width / 2;
            int halfH = height / 2;

            Matrix m = new Matrix();
            float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();
            float sy = (float) 2 * IMAGE_HALFWIDTH
                    / mBitmap.getHeight();
            m.setScale(sx, sy);
            //设置缩放信息
            //logo图片按martix设置的信息缩放
            mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,
                    mBitmap.getWidth(), mBitmap.getHeight(), m, false);

            int[] pixels = new int[size * size];
            for (int y = 0; y < size; y++) {
                for (int x = 0; x < size; x++) {
                    if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
                            && y > halfH - IMAGE_HALFWIDTH
                            && y < halfH + IMAGE_HALFWIDTH) {
                        //该位置用于存放图片信息
                        //记录图片每个像素信息
                        pixels[y * width + x] = mBitmap.getPixel(x - halfW
                                + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
                    } else {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * size + x] = 0xff000000;
                        } else {
                            pixels[y * size + x] = 0xffffffff;
                        }
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(size, size,
                    Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 生成二维码Bitmap  此方法与上面的createQRCodeWithLogo方法效果一样(设置Bitmap两种写方法)
     *
     * @param context
     * @param data     文本内容
     * @param logoBm   二维码中心的Logo图标(可以为null     * @return 合成后的bitmap
     */
    public static Bitmap createQRImage(Context context, String data, Bitmap logoBm) {
        try {
            if (data == null || "".equals(data)) {
                return null;
            }
            int widthPix = ((Activity) context).getWindowManager().getDefaultDisplay()
                    .getWidth();
            widthPix = widthPix / 5 * 3;
            int heightPix = widthPix;

            //配置参数
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //容错级别
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            //设置空白边距的宽度
            hints.put(EncodeHintType.MARGIN, 1); //default is 4

            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(data, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
            int[] pixels = new int[widthPix * heightPix];
            // 下面这里按照二维码的算法,逐个生成二维码的图片,
            // 两个for循环是图片横列扫描的结果
            for (int y = 0; y < heightPix; y++) {
                for (int x = 0; x < widthPix; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * widthPix + x] = 0xff000000;
                    } else {
                        pixels[y * widthPix + x] = 0xffffffff;
                    }
                }
            }
            // 生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);

            if (logoBm != null) {
                bitmap = addLogo(bitmap, logoBm);
            }

            return bitmap;
            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
            //return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 在二维码中间添加Logo图案
     */
    private static Bitmap addLogo(Bitmap src, Bitmap logo) {
        if (src == null) {
            return null;
        }
        if (logo == null) {
            return src;
        }
        //获取图片的宽高
        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();

        if (srcWidth == 0 || srcHeight == 0) {
            return null;
        }

        if (logoWidth == 0 || logoHeight == 0) {
            return src;
        }
        //logo大小为二维码整体大小的1/5
        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, 0, 0, null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);

            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
        } catch (Exception e) {
            bitmap = null;
            e.getStackTrace();
        }

        return bitmap;
    }
}

3、项目使用(有logo的二维码):

String content="阿胶糕-加微信:18703691242";
Bitmap bitmap = QrCodeUtil.createQRCodeWithLogo(content, 500,
                BitmapFactory.decodeResource(getResources(), R.mipmap.niuzai));
imgQr.setImageBitmap(bitmap);

或者

Bitmap bitmap = QrCodeUtil.createQRImage(UserSettingActivity.this, content,
        BitmapFactory.decodeResource(getResources(), R.mipmap.niuzai));
imgQr.setImageBitmap(bitmap);

没有logo的二维码:

String content="阿胶糕-加微信:18703691242";
Bitmap bitmap = QrCodeUtil.createQRCode(content, 500);
imgQr.setImageBitmap(bitmap);

说明:工具类中的 createQRCodeWithLogo方法  和  createQRImage方法是一样的效果,我都写在了工具类中,不需要的可以删掉其中一个方法。

二维码边框的边距设置方法 :第二的参数必须为整数 0 1 2 ...

hints.put(EncodeHintType.MARGIN, 1);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kongTy/article/details/80003580

智能推荐

autojs今日头条急速脚本_stevenzhao1的博客-程序员ITS304_今日头条极速版脚本

研究了一下刷头条的金币脚本,先下载autojs7pjb.apk安装在手机上,然后下载vscode安装到电脑上,然后安装相关autojs的插件。先新建一个项目,打开main.js,输入auto.waitFor();app.launchApp('今日头条极速版');sleep(10000);if (id("f2").exists()) { back(); id("f2").findOnce().click();}/** * 今日头条读新闻 */for (var i =

PCB原理图绘制(种草立创eda)_ZL.zheng的博客-程序员ITS304_立创eda怎么画原理图

首先,相对于我们平时所用的ad。这个就很适合我们英文不好的中国人了。然后这个一站式搞定,画完商城下单就可以做我们的板子了。整个设计界面也很友好,封装库也不需要我们自己封装。很多商城里面都有,可以直接购买使用。。具体教程我也是初学者,后面学习的时候在做笔记,现在发个学习的链接保存一下。一遍自己可以保存。https://docs.lceda.cn/cn/Videos/Demo-Video/index.html#%E7%AB%8B%E5%88%9BEDA%E5%BF%AB%E9%80%9F%E5%85%A5%

超像素(Superpixel)理解_Linear_Luo的博客-程序员ITS304_超像素是什么意思

最近看点云处理的文章,有些文章中提到了superpixel这个概念,查了一些资料,对其理解记录如下:超像素就是把一幅原本是像素级(pixel-level)的图,划分成区域级(district-level)的图。可以将其看做是对基本信息进行的抽象。超像素分割属于图像分割(image segmentation),再细化应该属于过分割(over segmentation)。比如我们对一幅图像进行超像

Paddle带你零基础入门深度学习_一直都在灬的博客-程序员ITS304_paddle 入门

PaddlePaddle带你零基础入门深度学习第一周手写数字识别任务数据处理网络结构损失函数优化算法训练调试与优化第一周手写数字识别任务手写数字识别任务数据处理数据处理优化 在工业实践中,我们面临的任务和数据环境千差万别,通常需要自己编写适合当前任务的数据处理程序,一般涉及如下五个环节:读入数据划分数据集生成批次数据训练样本集乱序校验数据有效性在数据读取与处理前,首先要加载飞桨和数据处理库,代码如下。# 加载飞桨和相关数据处理的库import paddleimport paddl

MQTT之ESP8266 OTA固件升级-坎坷记(FOTA爱之初体验)_久爱物联网的博客-程序员ITS304_mqtt ota

序:1、说实在的,这个问题不是很难,应该对于刚入手的人来说,也不容易。全都是边学边摸索边总结,经过几天的煎熬,终于实现。2、需要耐心分析原理,步骤。先看别人的代码,能跑起来的跑一遍。3、问题所在:别人的示例,仅单纯的示例,自己的项目是已经集成了多个功能,哪个也不能去掉,是不断附加的过程,代码后期再优化。所以就难到这了,由于C语言也不是很熟练,一知半解,才备受几天的煎熬。不会再翻视频学习...

随便推点

Android进阶:多线程断点续传下载_BianChengNinHao的博客-程序员ITS304

今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的.什么是多线程下载?多线程下载其实就是迅雷,BT一些下载原理,通过多个线程同时和服务器连接,那么你就可以榨取到较高的带宽了,大致做法是将文件切割成N块,每块交给单独一个线程去下载,各自下载完成后将文件块组合成一个文件,程序上要完成做

python实现登录验证系统(搭建MVC框架)_东木月的博客-程序员ITS304

小型登录注册验证系统一、概述​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统。在这个系统中初步了解认识MVC框架。​ 具备功能:登录、注册、改密、注销。​ 数据库:Redis,MySQL。​ 开发语言:Python。​ MVC框架:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器...

利用python修改json文件的value_cabinx的博客-程序员ITS304_python修改json文件内容

    做工程时遇到需要监听json文件,根据json文件中的key-value值作出相应处理的情形。为此写了修改json文件的python脚本供工程后续调用。    代码如下:# coding=utf-8 //设置文本格式import os,sysimport jsondef get_new_json(filepath,key,value): key_ = key.split(&quot;.&quot;...

指向函数的指针(一)_zhenyonghou的博客-程序员ITS304_指向函数的指针

之所以想写一篇函数指针的文章,源于函数指针在C/C++编程中使用的广泛性,而对于一些初级编程者来说对函数指针的使用或许有些迷惑,而一旦在适当的时候使用了函数指针,会使代码简洁有力。本篇介绍的是函数指针的基础部分,函数指针复杂的应用将在下一篇介绍。一  指向普通函数的指针先来看一个函数:int Sum(int a, int b){ return a + b;}这个函数,调用

java事件。_helianus的博客-程序员ITS304

事件一共有三个主体。1.事件源(Source Object),事件的发起者。2.监听器(Listener),监听事件的人。3.事件(Event)本身。举个栗子:你在看某个漂亮小姐姐的直播,当这个小姐姐给你唱了首歌的时候,你给他打赏了一个土豪土匪礼物。1.上面这句话中,小姐姐是事件源,而你则是监听器,监听着小姐姐。2.小

移动网关 CMWAP 返回vnd.wap.wml_H-G-Y的博客-程序员ITS304

用CMWAP接入点发一个http的请求时,移动的10.0.0.172这个代理网关会回一个确认页面,中国特色。处理的办法是检测到Content-type里面有个 vnd.wap.wml就重新发一次请求即可。HTTP/1.1 200 OK [ZTEOSE]Server: ZTEOSEDate: Fri, 30 Jul 2010 03:17:40 GMTServer: WebLo

推荐文章

热门文章

相关标签