利用ZXing生成带LOGO的二维码图片
新的一周开始了。
本篇文章的作者 天际空痕(天空) 是我的dota群中的一位成员,虽说水平很菜,但却经常喜欢1v9。不过比起他的dota水平,代码水平就要好得多了,比如本篇文章的技术含量就相当不错。现在二维码可以说是非常流行,大多数二维码的中央还都会有一张LOGO图片,那你知道二维码都是怎么生成的吗?还有LOGO图片是如何加上去的呢?本篇文章将为你答疑解惑。
天空 的博客地址:http://blog.csdn.net/dgs960825
昨天有个小伙伴问我怎么动态生成带logo的二维码,虽然我也见过带logo的二维码,但是不知道具体实现,我猜想ZXing能直接生成带logo的二维码吧。于是我去百度了一番,结果都是需要图片合成的。
想了一下,二维码的主要概念使用来存储文字信息,并不能存储图片信息,而带logo的二维码只是提供方加上去让别人知道这个二维码的提供方是谁。
在百度搜索了一番,搜到的资料或多或少有些瑕疵,而且大多都是互相转载,内容也没解释清楚,也有少部分讲解二维码算法(简单的生成带logo的矩形二维码不涉及二维码算法),于是自己想写一篇相关的文章。
本文是根据github上一个二维码库 QRCode(https://github.com/androidKaKa/QRCode)中第三个生成二维码demo改造而来,主要涉及:
-
Bitmap合成(图片合成)
-
二维码矩阵与一维像素相互转换(将logo转成像素放入二维码中间)
-
调用系统分享
1.通过Bitmap合成logo与白色背景,我们来看一下logo图和白色背景图:
咳咳咳~请原谅我盗用郭霖博客上婚纱照头像,我表示单身狗受到了一万点暴击伤害……白色背景图犹豫全白的无法显示,于是截了灰色的边框突出以下。我们来看看合成后的图:
我们来看下是怎么合成的吧:
因为我使用的白色背景图比较小,因此代码中以白色背景图得到的bitmap创建画布Canvas并且缩放logo图片。可以看到通过 ThumbnailUtils.extractThumbnail(logoBitmap,bgWidth*3/4,bgHeigh*3/4, ThumbnailUtils.OPTIONS_RECYCLE_INPUT) 将logo宽高缩放为白色背景图的3/4,我认为做好的比例。图片合成其实不难,主要通过Canvas 这个类中的方法实现,想要详细了解的同学请自行百度。
2.二维码矩阵与一维像素相互转换(将logo转成像素放入二维码中间) :
在实际操作当中我们的logo会遮挡中间部分的二维码,可能导致二维码失效,这个不用太担心,二维码识别有容错级别的,我们将容错级别设置为最大hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H),但是logo过大遮挡住关键信息还是会导致二维码失效,因此我们需要控制logo在二维码中占得比例,通过常量 LOGO_WIDTH_MAX 最大为二维码宽度的20%、LOGO_WIDTH_MIN 最小为二维码宽度的10%,具体大小还是以缩放后的logo宽高为准。
然后最关键的是怎么将带白色边框的logo放入二维码中间,在代码中可以看到通过双重for循环来将二维矩阵转换为一维像素数组,注释比较详细,就不多讲了。
3.调用系统分享
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageFileUri);
shareIntent.setType("image/*");
//自定义提示语
startActivity(Intent.createChooser(shareIntent, "分享到"));
从调用系统分享图片的代码可以看出我们需要先存储生成的二维码图片,通过 saveBitmap(Bitmap bitmap, String bitName)保存图片。
这样就将整个一套流程的代码全部完成了。
原文转自:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236176&idx=1&sn=dc78d57c3bb3715ca998565f15105b42&scene=23&srcid=0729Xh9A315if5wouVqS7FZb#rd