感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089

**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


小白补充:
https://www.jianshu.com/p/6607e69b1121
https://www.jb51.net/article/102494.htm


感谢大佬:https://www.jianshu.com/p/6607e69b1121

ZXing应用详解

现在的项目中需要加上二维码扫描,虽然使用了第三方库,也还好用,但是对这部分只是还是比较感兴趣,所以研究一下。

分类

二维码处理分为两部分:编码与解码

编码:使用字符串生成图片。

解码:解析图片中的字符串。

首先明确一个概念:二维码图片存在的形式非常多,文件、纸张、手机、电脑屏幕。在不同的平台上存在的形式是不一样的。

ZXing介绍

摘自百度百科

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

目前的认知告诉我们,二维码是以正方形的形式存在,以类似于二进制的方式存储数据。

在Zxing中,使用BitMatrix来描述一个二维码,在其内部存储一个看似boolean值的矩阵数组。这个类很好的抽象了二维码。

转换成图片

只使用zxing-core包,那么我们最多可以得到一个BitMatrix, 我们想要看见二维码,则还需要将其转换成一个图片,而图片在不同的平台则是以不同的形式存在的。如png文件, jpg文件、Android的Bitmap, Java SE的 BufferedImage.

具体转换成图片的方式,不同平台有不同的方法,后面会详细总结,这里只是尽快明确一下概念。

生成二维码介绍

zxing将生成图形编码的方式抽象成了一个类com.google.zxing.Writer, 在实现类中不仅仅生成二维码,还可以生成条形码等其他图形编码

Writer
BitMatrix encode(String contents, BarcodeFormat format, int width, int height) throws WriterException
BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType,?> hints) throws WriterException;

如上所示,Writer共有两个方法,都是用于生成二维码。方法参数说明如下

参数 说明
String contents 编码的内容
BarcodeFormat format 编码的方式(二维码、条形码...)
int width 首选的宽度
int height 首选的高度
Map<EncodeHintType,?> hints 编码时的额外参数

从上面可以看出,除了我们常规认为的编码需要内容之外,还有其他不少的信息,如编码的方式(这里只探讨二维码),二维码的首选宽高(首选的意思是:生成的图片的参考尺寸,如二维码是正方形,但给一个矩形,则会留白,条形码为矩形,设置一个正方形,则也会留白)。

下面详细讨论一下额外的参数,虽然不一定所有都用到,但是尽量讨论一些可能会用到的参数。编码额外的参数是以一个Map<EncodeHintType, ?>存在的,key为EncodeHintType枚举,那么可以看到所有的参数类型。

参数 说明
ERROR_CORRECTION 容错率,指定容错等级,例如二维码中使用的ErrorCorrectionLevel, Aztec使用Integer
CHARACTER_SET 编码集
DATA_MATRIX_SHAPE 指定生成的数据矩阵的形状,类型为SymbolShapeHint
MARGIN 生成条码的时候使用,指定边距,单位像素,受格式的影响。类型Integer, 或String代表的数字类型
PDF417_COMPACT 指定是否使用PDF417紧凑模式(具体含义不懂)类型Boolean
PDF417_COMPACTION 指定PDF417的紧凑类型
PDF417_DIMENSIONS 指定PDF417的最大最小行列数
AZTEC_LAYERS aztec编码相关,不理解
QR_VERSION 指定二维码版本,版本越高越复杂,反而不容易解析

从上面的参数表格可以看出,适用于二维码的有:ERROR_CORRECTION, CHARACTER_SET, MARGIN, QR_VERSION.

参数 使用说明
ERROR_CORRECTION 分为四个等级:L/M/Q/H, 等级越高,容错率越高,识别速度降低。例如一个角被损坏,容错率高的也许能够识别出来。通常为H
CHARACTER_SET 编码集,通常有中文,设置为 utf-8
MARGIN 默认为4, 实际效果并不是填写的值,一般默认值就行
QR_VERSION 通常不变,设置越高,反而不好用

下面是最简化的生成二维码的代码

/*** 生成二维码** @param contents 二维码内容* @return 二维码的描述对象 BitMatrix* @throws WriterException 编码时出错*/
private BitMatrix encode(String contents) throws WriterException {final Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, "utf-8");return new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, 320, 320, hints);
}

没错,就是这么简单。但是我们得到的是一个BitMatrix, 如果需要显示出来则要根据不同平台来处理。

BitMatrix 转换成图片

首先明确Java SE平台和Android平台的区别:Android平台移除关于swing部分的代码,所以如果SE平台使用到这部分代码,Android平台则不能用,不幸的是,官方的代码恰恰用到了这部分。

明确另外一个概念:图片在一个平台的存在形式有两种,内存和文件。虽然文件在不同平台通用,但是转换成文件的过程却不是通用的。如Android中将Bitmap转换成图片文件,SE中将BufferedImage转换成图片文件。所以实际上,最重要的是将BitMatrix转换成在内存中图片的存在形式。

Java SE平台

BitMatrix转换成BufferedImage.

在官方提供的zxing-javase包中已经有了相应的方法。下面是示例代码:

BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig(Color.BLACK.getRGB(), Color.WHITE.getRGB()));

方法原型为:

public static BufferedImage toBufferedImage(BitMatrix matrix, MatrixToImageConfig config)

关于其中的参数,如下表格所示:

参数 说明
BitMatrix 二维码的描述对象
MatrixToImageConfig 二维码转换成BufferedImage的配置参数

MatrixToImageConfig对象中只有两个域onColoroffColor, 文章开头提到二维码类似于二进制,这样的配置表示生成的BufferedImage用两种颜色来表示二维码上的开关。

BitMatrix转换成图片文件

在官方提供的zxing-javase包中实际上有将BitMatrix转换成图片文件的方法,不过实际上是先将BitMatrix转换成BufferedImage, 然后将其转换成图片文件。

转换方法(javax.imageio.ImageIO)

public static boolean write(RenderedImage im, String formatName, File output) throws IOException

参数说明:

参数 说明
RenderedImage im BufferedImage实现了RenderedImage接口
String formatName 图片文件格式,通常使用 png
File output 图片文件

上面两步结合起来就直接将BitMatrix转换成文件了,下面是MatrixToImageWriter的方法(类型Path表示文件路径,可以使用File.toPath()方法得到)

public static void writeToPath(BitMatrix matrix, String format, Path file, MatrixToImageConfig config) throws IOException

Android 平台

类似的,在Android中也是先将BitMatrix转换成Bitmap, 然后再写入到文件中。

Bitmap写入到文件中则非常熟悉了,如下所示:

Bitmap.compress(CompressFormat format, int quality, OutputStream stream)

其中的参数就不再解释了,主要需要讨论的是将BitMatrix转换成Bitmap

在讨论BitMatrixBitmap的转换之前,先研究一下两者的内部结构。

BitMatrix

翻译:BitMatrix表示位数组的二维矩阵。而它内部则是使用一维int数组来实现的,一个int数组有32位。不过比较特别的是,每一行都是由一个新的int值开始,如果列数不是32的倍数,一行最后一个int值中有没有用到的位。另外位是从int值的最小位开始排的,这是为了和com.google.zxing.common.BitArray更好的转换。

不关心其内部实现,在其抽象的数据结构中,x表示列数,y表示行数,可以通过BitMatrix.get(int x, int y)获取该位置是否为1(开).

BitMatrix中几个可能应该熟悉方法如下

方法 说明
public boolean get(int x, int y) 获取(x, y)的位值,true表示黑色
public void set(int x, int y) 设置(x, y)的位值为true
public void unset(int x, int y) 设置(x, y)的位值为false
public void flip(int x, int y) 对(x, y)的位值做非运算
public BitMatrix(int width, int height) 构造函数,指定宽高

另外说明一下com.google.zxing.common.BitArray这个类,这个类数据结构和BitMatrix的一行是一样的,使用int数组来表示一维位数组,同样的,最后一位int值可能有部分位没有用到。也同样的,位是从int值的最小位开始排列。

Bitmap

Bitmap内部是使用C实现的,所以不能直观看到,不过可以猜测到,其内部应该使用的是一维int数组来实现的,一个int值就表示一个点的颜色。

下面列举一些可能用到的一些方法

方法 说明
public static Bitmap createBitmap(int width, int height, Config config) 构造方法,创建一个透明的Bitmap
public void setPixels(@ColorInt int[] pixels, int offset, int stride, int x, int y, int width, int height) 使用数组中的颜色替换Bitmap的像素点的颜色
public void setPixel(int x, int y, @ColorInt int color) 设置Bitmap中指定像素点的颜色值

只列举上面几个方法是因为跟我们的理解和使用比较密切。

BitMatrix转换成Bitmap

从前面的理解,我们可以看出,实际上BitMatrix转换成Bitmap就是将其所代表的点的开关用颜色来表示。默认情况下,我们习惯使用黑色代表开,白色代表关。我们需要创建一个和BitMatrix长宽“相等”的Bitmap, 在转换过程中,我们发现BitMatrix某一个位置是开,我们则设置Bitmap相应位置的颜色为开的颜色,反之同理。(当然我们也可以根据特殊需求修改其中的颜色)

代码示例

private Bitmap bitMatrixToBitmap(BitMatrix bitMatrix) {final int width = bitMatrix.getWidth();final int height = bitMatrix.getHeight();
final int[] pixels = new int[width * height];
for (int y = 0; y &lt; height; y++) {for (int x = 0; x &lt; width; x++) {pixels[y * width + x] = bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF;}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;


http://www.taodudu.cc/news/show-4311034.html

相关文章:

  • 微信小程序动态生成二维码
  • php 生成国税局二维码
  • Java端生成二维码
  • Python爬虫伪装,请求头User-Agent池,和代理IP池搭建使用
  • 使用IP代理池伪装你的IP(python)
  • 【完美解决】爬虫伪装代理IP方案
  • [CTF]使用浏览器firefox插件伪装IP地址
  • Python创建免费Ip代理池,伪装Ip。
  • mt6761平台 源码内置APK报错“/lib/xxxx.so“ not found
  • 24V行车记录仪4Ω抛负载的选型及测试
  • 赛灵思 Xilinx UG1506 - Versal ACAP 开发板系统设计方法指南(中文版) (v2021.2)
  • 海思android随笔之工厂菜单PQ acm color调用流程
  • 全志A33移植openharmony3.1标准系统之添加产品编译
  • android system image 编译出错,Android framework 编译常见错误
  • 2022年外贸公司邮箱签名怎么设置?
  • 华为手机滑动速度设置_用华为手机的人,这个设置赶紧关了!速度流畅告别卡顿...
  • Android studio飞机大战游戏分析-月末总结
  • Android 手机获取加速度传感器加速度数据并自定义采样频率
  • android 支付宝sdk接入详解
  • 支付宝SDK集成服务端(java)
  • 支付宝 SDK6001 错误码 或 支付繁忙
  • spring boot 微信小程序支付SDK版本 微信支付统一下单
  • PHP使用支付宝SDK完成支付
  • android 支付sdk流程,支付SDK
  • android 支付sdk ----libPaySdk
  • 实例讲解:JAVA SOAP技术(2)完
  • bat和cmd文件是什么,dos又是什么东西
  • 安全无污染的激活win7(官方)
  • update和delete详解
  • GitHub在Markdown上乱哄哄 - 将666更改为DCLXVI

Android利用zxing生成二维码相关推荐

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

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

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

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

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

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

  4. java利用zxing生成二维码

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

  5. 利用zxing生成二维码

    这是一个测试过得的工具类,拿来可以直接使用. pom.xml添加 <dependency><groupId>com.google.zxing</groupId>&l ...

  6. Android之ZXing扫描二维码以及生成二维码

    Android之ZXing扫描二维码以及生成二维码 ZXIng项目地址:ZXing地址 项目结构 扫描二维码:使用 CaptureActivity类 项目代码: import android.cont ...

  7. zxing生成二维码及解析二维码

    ZXing生成二维码 1.下载jar https://github.com/ZF520/QRCode/raw/master/zxing/bin/lib/zxing3.3.1.jar 2.生成二维码的函 ...

  8. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  9. android 解析、生成二维码

    android 解析.生成二维码 (1)ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台 ...

最新文章

  1. 华中农业大学苏汉东课题组诚聘博士后-
  2. 解决 drupal8 提示“ settings.php ”设置未配置 问题
  3. android之android Studio 安装后打不开的解决方法
  4. (八)OpenStack---M版---双节点搭建---Cinder安装和配置
  5. 用计算机计算线性卷积的基本规则,实验三_线性卷积与圆周卷积的计算.doc
  6. 2014腾讯WE大会:开启未来的五大科技发展趋势
  7. Nginx反代Mogilefs分布式储存示例
  8. [动态代理三部曲:上] - 动态代理是如何坑掉了我4500块钱
  9. python 队列与栈的实现
  10. Java扩展机制可加载所有JAR
  11. Ocelot中文文档入门
  12. 一个简单的crontab
  13. ei会议和ei源刊的区别_核心期刊SCI论文发表 | SCI和EI和核心有什么区别
  14. (42)Verilog HDL 打两拍设计
  15. Excel控件 Spire.XLS系列教程(2):C# 设置现有 Excel 图表的数据标签样式
  16. silverlight小结
  17. React Native常用组件之ListView组件
  18. Decorator 装饰(结构型)
  19. 搞笑又雷人的个人签名
  20. python全栈工程师要求_Python全栈工程师

热门文章

  1. 智能时代为什么需要区块链技术?
  2. 实验室装水的容器叫什么_实验室常见水的种类_生命之源水
  3. Maven传递依赖的时候,同名包不同版本的包均会下载,但是编译的时候,只会加载一个高版本的。
  4. Java Swing事件处理——键盘事件及监听处理 KeyListener 按键测试
  5. Diagnostic Viewer 显示空白
  6. html怎么设置毛笔字体,原来毛笔字体是这么设计的!
  7. windows虚机环境下,如何快速有效的删除大文件夹?
  8. golang-如何用全局参数打印程序运行信息
  9. jquery 学习笔记及小练习
  10. 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题