Android利用zxing生成二维码
感谢大佬: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
对象中只有两个域onColor
和offColor
, 文章开头提到二维码类似于二进制,这样的配置表示生成的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
。
在讨论BitMatrix
与Bitmap
的转换之前,先研究一下两者的内部结构。
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 < height; y++) {for (int x = 0; x < 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生成二维码相关推荐
- Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程
gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...
- Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)
说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...
- Java利用Zxing生成二维码及解析二维码内容
前言 Java 操作二维码的开源项目很多,如 SwetakeQRCode.BarCode4j.Zxing 等等 本篇文章是介绍利用Zxing来生成二维码图片在web网页上展示,同时解析二维码图片. Z ...
- java利用zxing生成二维码
什么是ZXing? ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库. 利用ZXing这个工具库来生成二维码,具体操作如下: 引入相关资源包 <dependency&g ...
- 利用zxing生成二维码
这是一个测试过得的工具类,拿来可以直接使用. pom.xml添加 <dependency><groupId>com.google.zxing</groupId>&l ...
- Android之ZXing扫描二维码以及生成二维码
Android之ZXing扫描二维码以及生成二维码 ZXIng项目地址:ZXing地址 项目结构 扫描二维码:使用 CaptureActivity类 项目代码: import android.cont ...
- zxing生成二维码及解析二维码
ZXing生成二维码 1.下载jar https://github.com/ZF520/QRCode/raw/master/zxing/bin/lib/zxing3.3.1.jar 2.生成二维码的函 ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- android 解析、生成二维码
android 解析.生成二维码 (1)ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台 ...
最新文章
- 华中农业大学苏汉东课题组诚聘博士后-
- 解决 drupal8 提示“ settings.php ”设置未配置 问题
- android之android Studio 安装后打不开的解决方法
- (八)OpenStack---M版---双节点搭建---Cinder安装和配置
- 用计算机计算线性卷积的基本规则,实验三_线性卷积与圆周卷积的计算.doc
- 2014腾讯WE大会:开启未来的五大科技发展趋势
- Nginx反代Mogilefs分布式储存示例
- [动态代理三部曲:上] - 动态代理是如何坑掉了我4500块钱
- python 队列与栈的实现
- Java扩展机制可加载所有JAR
- Ocelot中文文档入门
- 一个简单的crontab
- ei会议和ei源刊的区别_核心期刊SCI论文发表 | SCI和EI和核心有什么区别
- (42)Verilog HDL 打两拍设计
- Excel控件 Spire.XLS系列教程(2):C# 设置现有 Excel 图表的数据标签样式
- silverlight小结
- React Native常用组件之ListView组件
- Decorator 装饰(结构型)
- 搞笑又雷人的个人签名
- python全栈工程师要求_Python全栈工程师
热门文章
- 智能时代为什么需要区块链技术?
- 实验室装水的容器叫什么_实验室常见水的种类_生命之源水
- Maven传递依赖的时候,同名包不同版本的包均会下载,但是编译的时候,只会加载一个高版本的。
- Java Swing事件处理——键盘事件及监听处理 KeyListener 按键测试
- Diagnostic Viewer 显示空白
- html怎么设置毛笔字体,原来毛笔字体是这么设计的!
- windows虚机环境下,如何快速有效的删除大文件夹?
- golang-如何用全局参数打印程序运行信息
- jquery 学习笔记及小练习
- 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题