使用ZXing生成二维码,可设置中间icon,边缘白色宽度为0

import android.graphics.Bitmap;
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 java.util.Hashtable;

/**
 * Created by xiaolei on 2017/4/26.
 */

public class QRCodeUtil
{
    // 生成QR图
    public static Bitmap createImage(String text, int w, int h, Bitmap logo)
    {
        try
        {
            Bitmap scaleLogo = getScaleLogo(logo, w, h);
            int offsetX = (w - scaleLogo.getWidth()) / 2;
            int offsetY = (h - scaleLogo.getHeight()) / 2;
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.MARGIN, 0);
            BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                    BarcodeFormat.QR_CODE, w, h, hints);
            int[] pixels = new int[w * h];
            for (int y = 0; y < h; y++)
            {
                for (int x = 0; x < w; x++)
                {
                    if (x >= offsetX && x < offsetX + scaleLogo.getWidth() && y >= offsetY && y < offsetY + scaleLogo.getHeight())
                    {
                        int pixel = scaleLogo.getPixel(x - offsetX, y - offsetY);
                        if (pixel == 0)
                        {
                            if (bitMatrix.get(x, y))
                            {
                                pixel = 0xff000000;
                            } else
                            {
                                pixel = 0xffffffff;
                            }
                        }
                        pixels[y * w + x] = pixel;
                    } else
                    {
                        if (bitMatrix.get(x, y))
                        {
                            pixels[y * w + x] = 0xff000000;
                        } else
                        {
                            pixels[y * w + x] = 0xffffffff;
                        }
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(w, h,
                    Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, w, 0, 0, w, h);
            return bitmap;
        } catch (WriterException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    private static Bitmap getScaleLogo(Bitmap logo, int w, int h)
    {
        if (logo == null) return null;
        Matrix matrix = new Matrix();
        float scaleFactor = Math.min(w * 1.0f / 5 / logo.getWidth(), h * 1.0f / 5 / logo.getHeight());
        matrix.postScale(scaleFactor, scaleFactor);
        Bitmap result = Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), matrix, true);
        return result;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android知识点总结

1-VIII--ViewPager的基本使用

1003
来自专栏编程之路

Android 深入(二)- 利用ToolBar实现动态主题

利用ToolBar实现主题切换原理:切换主题时,将颜色值存储到Preference中,同时更新主题样式。再次打开App读取Preference对应的颜色值,设置...

882
来自专栏Android开发小工

RecyclerView的通用快速适配封装

其实这篇博客是我后面一篇博客的准备~一句话实现RecyclerView的单选多选的选项列表

774
来自专栏编程之路

羊皮书APP(Android版)开发系列(十五)Android 循环滚动,自动轮播广告展示

1625
来自专栏向治洪

ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示(优化篇)

上一张效果图: ? ? ? 之前的项目有一个Galley的项目,但是代码结构特别乱,别问我为什么,我也是刚接手这个项目,为了方便以后阅读和维护我对一些模块进行了...

2749
来自专栏非著名程序员

Android学习笔记(一)之仿正点闹钟时间齿轮滑动的效果

看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在...

20910
来自专栏Spring相关

碎片的动态添加

481
来自专栏何俊林

一款使用RxJava+Retrofit+MVP的快播App开源啦!

《快播》,仿网易云音乐UI,整体采用RxJava+Retrofit+MVP的架构,支持在线视频播放,在线图片浏览等功能。

1224
来自专栏李蔚蓬的专栏

揭露动画实现时的注意事项(附上bug-logcat)

昨天晚上开始学一下这个揭露动画,准备用在项目中做一个转场,啃完了API之后开始写个小demo,距离跑成功一步之遥的当儿,出了个bug,就怎么点击按钮都没用。

771
来自专栏Android机器圈

Fragment生命周期及实现点击导航图片切换fragment,Demo

PS:Fragment简介     Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板...

38112

扫码关注云+社区