gayhub上的zxing可用于生成二维码,识别二维码
gayhub地址:https://github.com/zxing/zxing
此文只是简易教程,文末附有完整代码和demo下载地址,进入正题:

(1)下载并导入zxing.jar包

下载:

zxing.jar下载地址,只需要1积分,方便大家学习下载。

把下载好的zxing.jar放在app的libs文件夹内,如图

导入:

进入project structure.如图

点进去之后,依次进入app——Dependencies——jar dependency:

选择zxing.jar,导入

(2)生成二维码:

生成二维码的函数:

public void createQRcodeImage(String url){im1=(ImageView)findViewById(R.id.imageView);w=im1.getWidth();h=im1.getHeight();try{//判断URL合法性if (url == null || "".equals(url) || url.length() < 1){return;}Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//图像数据转换,使用了矩阵转换BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, w, h, hints);int[] pixels = new int[w * h];//下面这里按照二维码的算法,逐个生成二维码的图片,//两个for循环是图片横列扫描的结果for (int y = 0; y < h; y++){for (int x = 0; x < w; x++){if (bitMatrix.get(x, y)){pixels[y * w + x] = 0xff000000;}else{pixels[y * w + x] = 0xffffffff;}}}//生成二维码图片的格式,使用ARGB_8888Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, w, 0, 0, w, h);//显示到我们的ImageView上面im1.setImageBitmap(bitmap);}catch (WriterException e){e.printStackTrace();}}

设置两种转换方式,默认转换/自定义转换:

        Button bt=(Button)findViewById(R.id.button);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {createQRcodeImage("https://blog.csdn.net/mountain_hua");//url为我的csdn博客地址}});Button bt2=(Button)findViewById(R.id.button2);bt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EditText editText=(EditText)findViewById(R.id.editText);createQRcodeImage(editText.getText().toString());//自定义转换内容}});

默认转换为我的博客:                                                    自定义转换:

二维码转换出来了,可以拿手机扫一扫试一试。

(3)识别二维码

识别二维码需要一个RGBLuminanceSource类:

//识别图片所需要的RGBLuminanceSource类public class RGBLuminanceSource extends LuminanceSource {private byte bitmapPixels[];protected RGBLuminanceSource(Bitmap bitmap) {super(bitmap.getWidth(), bitmap.getHeight());// 首先,要取得该图片的像素数组内容int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight());// 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容for (int i = 0; i < data.length; i++) {this.bitmapPixels[i] = (byte) data[i];}}@Overridepublic byte[] getMatrix() {// 返回我们生成好的像素数据return bitmapPixels;}@Overridepublic byte[] getRow(int y, byte[] row) {// 这里要得到指定行的像素数据System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());return row;}}

识别二维码的函数:

     //识别二维码的函数public void recogQRcode(ImageView imageView){Bitmap QRbmp = ((BitmapDrawable) (imageView).getDrawable()).getBitmap();   //将图片bitmap化int width = QRbmp.getWidth();int height = QRbmp.getHeight();int[] data = new int[width * height];QRbmp.getPixels(data, 0, width, 0, 0, width, height);    //得到像素RGBLuminanceSource source = new RGBLuminanceSource(QRbmp);   //RGBLuminanceSource对象BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));QRCodeReader reader = new QRCodeReader();Result re = null;try {//得到结果re = reader.decode(bitmap1);} catch (NotFoundException e) {e.printStackTrace();} catch (ChecksumException e) {e.printStackTrace();} catch (FormatException e) {e.printStackTrace();}//Toast出内容Toast.makeText(MainActivity.this,re.getText(),Toast.LENGTH_SHORT).show();//利用正则表达式判断内容是否是URL,是的话则打开网页String regex = "(((https|http)?://)?([a-z0-9]+[.])|(www.))"+ "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";//设置正则表达式Pattern pat = Pattern.compile(regex.trim());//比对Matcher mat = pat.matcher(re.getText().trim());if (mat.matches()){Uri uri = Uri.parse(re.getText());Intent intent = new Intent(Intent.ACTION_VIEW, uri);//打开浏览器startActivity(intent);}}

下面看识别效果:

这是识别URL的结果:                                        这是识别一般文字的结果:

(4)完整代码:

Mainactivity:

package mountain_hua.learn_zxing;import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.EncodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MainActivity extends AppCompatActivity {private ImageView im1;  //imageview图片private int w,h;        //图片宽度w,高度h@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button bt=(Button)findViewById(R.id.button);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {createQRcodeImage("https://blog.csdn.net/mountain_hua");//url为我的csdn博客地址}});Button bt2=(Button)findViewById(R.id.button2);bt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EditText editText=(EditText)findViewById(R.id.editText);createQRcodeImage(editText.getText().toString());//自定义转换内容}});Button bt3=(Button)findViewById(R.id.button3);bt3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {im1=(ImageView)findViewById(R.id.imageView);recogQRcode(im1);}});}//转换成二维码QRcode的函数。参数为一个字符串public void createQRcodeImage(String url){im1=(ImageView)findViewById(R.id.imageView);w=im1.getWidth();h=im1.getHeight();try{//判断URL合法性if (url == null || "".equals(url) || url.length() < 1){return;}Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//图像数据转换,使用了矩阵转换BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, w, h, hints);int[] pixels = new int[w * h];//下面这里按照二维码的算法,逐个生成二维码的图片,//两个for循环是图片横列扫描的结果for (int y = 0; y < h; y++){for (int x = 0; x < w; x++){if (bitMatrix.get(x, y)){pixels[y * w + x] = 0xff000000;}else{pixels[y * w + x] = 0xffffffff;}}}//生成二维码图片的格式,使用ARGB_8888Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, w, 0, 0, w, h);//显示到我们的ImageView上面im1.setImageBitmap(bitmap);}catch (WriterException e){e.printStackTrace();}}//识别二维码的函数public void recogQRcode(ImageView imageView){Bitmap QRbmp = ((BitmapDrawable) (imageView).getDrawable()).getBitmap();   //将图片bitmap化int width = QRbmp.getWidth();int height = QRbmp.getHeight();int[] data = new int[width * height];QRbmp.getPixels(data, 0, width, 0, 0, width, height);    //得到像素RGBLuminanceSource source = new RGBLuminanceSource(QRbmp);   //RGBLuminanceSource对象BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));QRCodeReader reader = new QRCodeReader();Result re = null;try {//得到结果re = reader.decode(bitmap1);} catch (NotFoundException e) {e.printStackTrace();} catch (ChecksumException e) {e.printStackTrace();} catch (FormatException e) {e.printStackTrace();}//Toast出内容Toast.makeText(MainActivity.this,re.getText(),Toast.LENGTH_SHORT).show();//利用正则表达式判断内容是否是URL,是的话则打开网页String regex = "(((https|http)?://)?([a-z0-9]+[.])|(www.))"+ "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";//设置正则表达式Pattern pat = Pattern.compile(regex.trim());//比对Matcher mat = pat.matcher(re.getText().trim());if (mat.matches()){Uri uri = Uri.parse(re.getText());Intent intent = new Intent(Intent.ACTION_VIEW, uri);//打开浏览器startActivity(intent);}}//识别图片所需要的RGBLuminanceSource类public class RGBLuminanceSource extends LuminanceSource {private byte bitmapPixels[];protected RGBLuminanceSource(Bitmap bitmap) {super(bitmap.getWidth(), bitmap.getHeight());// 首先,要取得该图片的像素数组内容int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight());// 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容for (int i = 0; i < data.length; i++) {this.bitmapPixels[i] = (byte) data[i];}}@Overridepublic byte[] getMatrix() {// 返回我们生成好的像素数据return bitmapPixels;}@Overridepublic byte[] getRow(int y, byte[] row) {// 这里要得到指定行的像素数据System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());return row;}}}

布局文件activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imageView"android:layout_width="300dp"android:layout_height="300dp"app:srcCompat="@android:color/background_light" /><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAllCaps="false"android:text="转换成二维码(mountain_hua的博客)" /><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:hint="输入要转换的内容"android:inputType="textPersonName" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="自定义转换" /><Buttonandroid:id="@+id/button3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="识别二维码" />
</LinearLayout>

demo下载地址:https://download.csdn.net/download/mountain_hua/10471127

本文参考:

https://www.jianshu.com/p/20db116b6279

https://blog.csdn.net/qq_29634351/article/details/78688315

http://www.cnblogs.com/mythou/p/3280023.html

https://www.2cto.com/kf/201603/495847.html

续:在二维码中间填充图片logo

首先说明,二维码是有一定的纠错功能的,二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达30%仍可恢复信息。但三个角上的“回”字及周围的底色不要改变,这是用于二维码定位的,最好是填充图片在中间,越小越好。

下面进入正题:

填充图片函数:

    //给二维码添加图片//第一个参数为原二维码,第二个参数为添加的logoprivate static Bitmap addLogo(Bitmap src, Bitmap logo) {//如果原二维码为空,返回空if (src ==null ) {return null;}//如果logo为空,返回原二维码if (src ==null ||logo ==null) {return src;}//这里得到原二维码bitmap的数据int srcWidth = src.getWidth();int srcHeight = src.getHeight();//logo的Width和Heightint logoWidth = logo.getWidth();int logoHeight = logo.getHeight();//同样如果为空,返回空if (srcWidth == 0 || srcHeight == 0) {return null;}//同样logo大小为0,返回原二维码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;}

然后在button中设置监听:

Button bt4=(Button)findViewById(R.id.button4);bt4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {im1=(ImageView)findViewById(R.id.imageView);Bitmap QRbmp = ((BitmapDrawable) (im1).getDrawable()).getBitmap();   //将图片bitmap化//将drawable里面的图片bitmap化Bitmap logo = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);im1.setImageBitmap(addLogo(QRbmp,logo));}});

效果如下:

附完整版demo(带填充图片):https://download.csdn.net/download/mountain_hua/10473011

Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程相关推荐

  1. Android利用zxing生成二维码

    感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...

  2. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  3. 利用ZXing生成和读取二维码

    在日常生活中二维码的使用非常频繁,给我们带来了极大的方便,避免了许多不必要的输入,也减少了在输入过程中的错误. 刚学完利用ZXing生成二维码的简单例子,在此给出最基本的源码,关于ZXing的jar文 ...

  4. 2023微信社区小程序+APP+后台,附带超详细完整搭建教程【源码+教程】

    2023微信社区小程序+APP+后台,附带超详细完整搭建教程[源码+教程] 微信授权登陆正常,小程序和APP带后台 手机号登陆正常,发帖,建圈子.发活动. 微信小程序是一种轻量级的应用程序,可以在微信 ...

  5. Android利用zxing用相机扫描识别二维码(添加闪光灯和本地二维码)超详细教程

    之前写了怎么用zxing的jar包进行简单的识别和生成二维码,以及生成带图片的二维码. 接下来单独说说怎么用相机扫描二维码,用相机扫描二维码相对于前面的生成二维码,识别二维码来说要麻烦一点,网上的教程 ...

  6. Java利用Zxing生成二维码及解析二维码内容

    前言 Java 操作二维码的开源项目很多,如 SwetakeQRCode.BarCode4j.Zxing 等等 本篇文章是介绍利用Zxing来生成二维码图片在web网页上展示,同时解析二维码图片. Z ...

  7. java利用zxing生成二维码

    什么是ZXing? ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库. 利用ZXing这个工具库来生成二维码,具体操作如下: 引入相关资源包 <dependency&g ...

  8. android扫码二维码识别二维码

    1. 快速集成扫码二维码,识别二维码功能.经过加工处理优化的,直接返回扫码结果字符串和图片的bitmap数据. 直接上代码: package com.xinxinchelian.myscanzxing ...

  9. 使用Zxing实现拍照,选取图片识别二维码

    转载请注明出处 作者:AboutJoke ( http://blog.csdn.net/u013200308 ) 原文链接:http://blog.csdn.net/u013200308/articl ...

最新文章

  1. 用好ASP.NET 2.0的URL映射
  2. SpringMVC中@GetMapping和@RequestMapping的区别
  3. strncmp实现方式之一
  4. 后端数据操作超时_数据分析在知乎商业质量保障中的初步实践
  5. 对Spring事务一些问题的讨论
  6. docker 部署_GitLab CI 自动部署netcore web api 到Docker
  7. P3441-[POI2006]MET-Subway【图论,贪心】
  8. 使用 Visual Studio 编译 wget 为库文件
  9. 1.10 编程基础之简单排序_10 单词排序
  10. python 保存文件 吃内存_python检测空间储存剩余大小和指定文件夹内存占用的实例...
  11. uni 登录token方法_封装uni-app的须要token的要求
  12. Numpy——numpy属性
  13. 百度免费开放长语音识别功能
  14. Redis入门指南(三)
  15. 跑分软件测试原理,只会比高低?教你三分钟看懂安兔兔跑分
  16. Python+FFmpeg音视频格式转换
  17. JavaScript 原型
  18. 词根词缀 (一):前缀篇
  19. arduino: 各种Arduino基础器件的用法图
  20. 绘王DWH69智能数位板,你听说了吗?

热门文章

  1. Photoshop支持ICO图片格式(咋个办呢 zgbn)
  2. Android 编译错误:CreateProcess error=206, 文件名或扩展名太长。
  3. 人物-作家-马克·吐温:马克·吐温
  4. 中国2001-2019年各省风险投资数据VC
  5. python random模块中seed函数的详解_random.seed()函数理解
  6. Centos7配置 yum代理
  7. 51单片机数码管滚动显示学号_单片机数码管显示0到9程序代码
  8. 根据E-R图设计数据库表
  9. MySQL 字符串数字转换
  10. nas文件服务器访问限制,nas文件服务器远程访问