Android中使用ZXing生成二维码(支持添加Logo图案)
程序员文章站
2024-02-19 17:45:22
zxing是谷歌的一个开源库,可以用来生成二维码、扫描二维码。本文所介绍的是第一部分。
首先上效果图:
zxing相关各种文件官方下载地址:
或者在这里下载(只有...
zxing是谷歌的一个开源库,可以用来生成二维码、扫描二维码。本文所介绍的是第一部分。
首先上效果图:
zxing相关各种文件官方下载地址:
或者在这里下载(只有本项目所用的jar包,版本号:3.2.0):链接:http://pan.baidu.com/s/1plqar5x
1.生成二维码的工具类
/** * 二维码生成工具类 */ public class qrcodeutil { /** * 生成二维码bitmap * * @param content 内容 * @param widthpix 图片宽度 * @param heightpix 图片高度 * @param logobm 二维码中心的logo图标(可以为null) * @param filepath 用于存储二维码图片的文件路径 * @return 生成二维码及保存文件是否成功 */ public static boolean createqrimage(string content, int widthpix, int heightpix, bitmap logobm, string filepath) { try { if (content == null || "".equals(content)) { return false; } //配置参数 map<encodehinttype, object=""> hints = new hashmap<>(); hints.put(encodehinttype.character_set, "utf-8"); //容错级别 hints.put(encodehinttype.error_correction, errorcorrectionlevel.h); //设置空白边距的宽度 // hints.put(encodehinttype.margin, 2); //default is 4 // 图像数据转换,使用了矩阵转换 bitmatrix bitmatrix = new qrcodewriter().encode(content, 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); } //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大! return bitmap != null && bitmap.compress(bitmap.compressformat.jpeg, 100, new fileoutputstream(filepath)); } catch (writerexception | ioexception e) { e.printstacktrace(); } return false; } /** * 在二维码中间添加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; } }</encodehinttype,>
2.在activity中的使用:
/** * 二维码生成 */ public class mainactivity extends actionbaractivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //内容 final edittext contentet = (edittext) findviewbyid(r.id.create_qr_content); //显示二维码图片 final imageview imageview = (imageview) findviewbyid(r.id.create_qr_iv); //是否添加logo final checkbox addlogocb = (checkbox) findviewbyid(r.id.create_qr_addlogo); button createqrbtn = (button) findviewbyid(r.id.create_qr_btn); createqrbtn.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { final string filepath = getfileroot(mainactivity.this) + file.separator + "qr_" + system.currenttimemillis() + ".jpg"; //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中 new thread(new runnable() { @override public void run() { boolean success = qrcodeutil.createqrimage(contentet.gettext().tostring().trim(), 800, 800, addlogocb.ischecked() ? bitmapfactory.decoderesource(getresources(), r.mipmap.qr_logo) : null, filepath); if (success) { runonuithread(new runnable() { @override public void run() { imageview.setimagebitmap(bitmapfactory.decodefile(filepath)); } }); } } }).start(); } }); } //文件存储根目录 private string getfileroot(context context) { if (environment.getexternalstoragestate().equals(environment.media_mounted)) { file external = context.getexternalfilesdir(null); if (external != null) { return external.getabsolutepath(); } } return context.getfilesdir().getabsolutepath(); } }
3.本项目中图片文件保存在
context.getexternalfilesdir(null)
目录之下的。按照官方的api文档,从kitkat开始(android 4.4),保存文件到这个目录下将不需要sd卡读写权限。但是经过测验表明,在红米note和魅族mx3上(系统均为android 4.4.4),的确不需要权限;但是在本人的华为p6上(android 4.4.2),必须声明权限才能成功的保存文件,即必须在manifest中添加如下内容:
<uses-permission android:name="android.permission.write_external_storage"> <uses-permission android:name="android.permission.mount_unmount_filesystems"></uses-permission></uses-permission>
因此,个人猜测,所谓的不需要权限是从 android 4.4.4开始的。
下面再给大家分享android生成二维码及添加logo的代码
具体代码如下所示:
@override public bitmap generatebitmap(string content, int width, int height) { qrcodewriter qrcodewriter = new qrcodewriter(); map<encodehinttype, string> hints = new hashmap<>(); hints.put(encodehinttype.character_set, "utf-8");//默认 hints.put(encodehinttype.margin, "1");//无白色边框 try { bitmatrix encode = qrcodewriter.encode(content, barcodeformat.qr_code, width, height, hints); int[] pixels = new int[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (encode.get(j, i)) { pixels[i * width + j] = 0x00000000; } else { pixels[i * width + j] = 0xffffffff; } } } return bitmap.createbitmap(pixels, 0, width, width, height, bitmap.config.rgb_565); } catch (writerexception e) { e.printstacktrace(); } return null; } @override public bitmap addlogo(bitmap qrbitmap, bitmap logobitmap) { int qrbitmapwidth = qrbitmap.getwidth(); int qrbitmapheight = qrbitmap.getheight(); int logobitmapwidth = logobitmap.getwidth(); int logobitmapheight = logobitmap.getheight(); bitmap blankbitmap = bitmap.createbitmap(qrbitmapwidth, qrbitmapheight, bitmap.config.argb_8888); canvas canvas = new canvas(blankbitmap); canvas.drawbitmap(qrbitmap, 0, 0, null); canvas.save(canvas.all_save_flag); float scalesize = 1.0f; while ((logobitmapwidth / scalesize) > (qrbitmapwidth / 3.5) || (logobitmapheight / scalesize) > (qrbitmapheight / 3.5)) { scalesize *= 2; } float sx = 1.0f / scalesize; canvas.scale(sx, sx, qrbitmapwidth / 2, qrbitmapheight / 2); canvas.drawbitmap(logobitmap, (qrbitmapwidth - logobitmapwidth) / 2, (qrbitmapheight - logobitmapheight) / 2, null); canvas.restore(); return blankbitmap; }
好了,代码到此结束了,希望对大家有所帮助!
上一篇: 使用systemctl start报错
推荐阅读
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
Android中使用ZXing生成二维码(支持添加Logo图案)
-
Android中使用ZXing生成二维码(支持添加Logo图案)