在这里,我们将给大家分享关于[php]二维码的知识,让您更了解PHP二维码生成的本质,同时也会涉及到如何更有效地AndroidZXing二维码、条形码扫描介绍、Android二维码、Android二维
在这里,我们将给大家分享关于[php] 二维码的知识,让您更了解PHP二维码生成的本质,同时也会涉及到如何更有效地Android ZXing 二维码、条形码扫描介绍、Android 二维码、Android 二维码 生成和识别 [转]、Android 二维码 生成和识别(附Demo源码)的内容。
本文目录一览:- [php] 二维码(PHP二维码生成)
- Android ZXing 二维码、条形码扫描介绍
- Android 二维码
- Android 二维码 生成和识别 [转]
- Android 二维码 生成和识别(附Demo源码)
[php] 二维码(PHP二维码生成)
以
把下载包导入到三方应用目录下,也就是Vendor目录下
二、生成二维码的方法:
<span><span>/* </span><span>二维码</span><span> */ </span><span>public function </span><span>qrcode</span>(<span><em>$url</em></span><span>=</span><span>''http://www.baidu.com''</span>,<span><em>$level</em></span><span>=</span><span>3</span>,<span><em>$size</em></span><span>=</span><span>4</span>){ <span>Vendor</span>(<span>''phpqrcode.phpqrcode''</span>); $errorCorrectionLevel <span>=</span><span><em>intval</em></span>(<span><em>$level</em></span>) ;<span>//</span><span>容错级别 </span><span></span>$matrixPointSize <span>= </span><span><em>intval</em></span>(<span><em>$size</em></span>);<span>//</span><span>生成图片大小 </span><span></span><span>//</span><span>生成二维码图片</span><span></span><span></span>$object <span>= new </span>\QRcode(); $object<span>-></span><span>png</span>(<span><em>$url</em></span>, <span>false</span>, $errorCorrectionLevel, $matrixPointSize, <span>2</span>); }</span>
三、在模板中使用
立即学习“PHP免费学习笔记(深入)”;
<span>img </span><span>src=</span><span>"__CONTROLLER__/qrcode" </span><span>alt=</span><span>"</span><span>百度一下二维码</span><span>"</span>/>
谢谢关注!
版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了[php] 二维码,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
Android ZXing 二维码、条形码扫描介绍
最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目。它提供二维码和条形码的扫描。扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指定的二维码格式进行编码和解码。
1.什么是二维码和条形码?
二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。
2.ZXing基本介绍ZXing是一个开源Java类库用于解析多种格式的条形码和二维码.官网:http://code.google.com/p/zxing/
截止目前为止最新版本提供以下编码格式的支持:
- UPC-A and UPC-E
- EAN-8 and EAN-13
- Code 39
- Code 93
- Code 128
- QR Code
- ITF
- Codabar
- RSS-14 (all variants)
- Data Matrix
- PDF 417 (''alpha'' quality)
- Aztec (''alpha'' quality)
同时官网提供了 Android、cpp、C#、iPhone、j2me、j2se、jruby、objc、rim、symbian等多种应用的类库,具体详情可以参考下载的源码包中。
3.Android端编码演示这里使用的ZXing是经过简化版的,去除了一些一般使用不必要的文件,项目工程和效果截图如下:
其中encoding包是在原基础上加上去的,功能是根据传入的字符串来生成二维码图片,返回一个Bitmap,其余的包是ZXing项目自带的。另外对扫描界面的布局也进行了修改,官方的扫描界面是横向的,我改成了纵向的,并加入了顶部的Tab和取消按钮(camera.xml),另外还需要的一些文件是colors.xml、ids.xml,这些都是原本ZXing项目中自带的,最后就是libs下面的jar包。
接下来看如何使用,首先是把ZXing项目中的一些文件拷贝到我们自己的项目中,然后在Mainifest文件中进行配置权限:
- <font color="#000"><font face="Arial"> <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.camera.autofocus" /></font></font>
还有就是扫描界面Activity的配置:
- <font color="#000"> <activity
- android:configChanges="orientation|keyboardHidden"
- android:name="com.zxing.activity.CaptureActivity"
- android:screenOrientation="portrait"
- android:theme="@android :style/Theme.NoTitleBar.Fullscreen"
- android:windowSoftInputMode="stateAlwaysHidden" >
- </activity></font>
接下来是我自己项目的布局文件:
- <font color="#000"><font face="Arial"><?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@android :color/white"
- android:orientation="vertical" >
-
- <Button
- android:id="@+id/btn_scan_barcode"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="30dp"
- android:text="Open camera" />
-
- <LinearLayout
- android:orientation="horizontal"
- android:layout_marginTop="10dp"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@android :color/black"
- android:textSize="18sp"
- android:text="Scan result:" />
-
- <TextView
- android:id="@+id/tv_scan_result"
- android:layout_width="fill_parent"
- android:textSize="18sp"
- android:textColor="@android :color/black"
- android:layout_height="wrap_content" />
- </LinearLayout>
-
- <EditText
- android:id="@+id/et_qr_string"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="30dp"
- android:hint="Input the text"/>
-
- <Button
- android:id="@+id/btn_add_qrcode"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Generate QRcode" />
-
- <ImageView
- android:id="@+id/iv_qr_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:layout_gravity="center"/>
-
- </LinearLayout></font></font>
下面是主Activity的代码,主要功能是打开扫描框、显示扫描结果、根据输入的字符串生成二维码图片:
- <font color="#000"><font face="Arial">public class BarCodeTestActivity extends Activity {
- /** Called when the activity is first created. */
- private TextView resultTextView;
- private EditText qrStrEditText;
- private ImageView qrImgImageView;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);
- qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);
- qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);
-
- Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);
- scanBarCodeButton.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- //打开扫描界面扫描条形码或二维码
- Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class);
- startActivityForResult(openCameraIntent, 0);
- }
- });
-
- Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);
- generateQRCodeButton.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- try {
- String contentString = qrStrEditText.getText().toString();
- if (!contentString.equals("")) {
- //根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)
- Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);
- qrImgImageView.setImageBitmap(qrCodeBitmap);
- }else {
- Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();
- }
-
- } catch (WriterException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- });
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- //处理扫描结果(在界面上显示)
- if (resultCode == RESULT_OK) {
- Bundle bundle = data.getExtras();
- String scanResult = bundle.getString("result");
- resultTextView.setText(scanResult);
- }
- }
- }</font></font>
其中生成二维码图片的代码在EncodingHandler.java中:
- <font color="#000"><font face="Arial">public final class EncodingHandler {
- private static final int BLACK = 0xff000000;
-
- public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {
- Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
- hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
- BitMatrix matrix = new MultiFormatWriter().encode(str,
- BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);
- int width = matrix.getWidth();
- int height = matrix.getHeight();
- int[] pixels = new int[width * height];
-
- for (int y = 0; y < height; y++) {
- for (int x = 0; x < width; x++) {
- if (matrix.get(x, y)) {
- pixels[y * width + x] = BLACK;
- }
- }
- }
- Bitmap bitmap = Bitmap.createBitmap(width, height,
- Bitmap.Config.ARGB_8888);
- bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
- return bitmap;
- }
- }</font></font>
最后是在哪里对扫描结果进行解码,进入CaptureActivity.java找到下面这个方法便可以对自己对结果进行操作:
- <font color="#000"><font face="Arial"> /**
- * Handler scan result
- * @param result
- * @param barcode
- */
- public void handleDecode(Result result, Bitmap barcode) {
- inactivityTimer.onActivity();
- playBeepSoundAndVibrate();
- String resultString = result.getText();
- //FIXME
- if (resultString.equals("")) {
- Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
- }else {
- // System.out.println("Result:"+resultString);
- Intent resultIntent = new Intent();
- Bundle bundle = new Bundle();
- bundle.putString("result", resultString);
- resultIntent.putExtras(bundle);
- this.setResult(RESULT_OK, resultIntent);
- }
- CaptureActivity.this.finish();
- }</font></font>
4.Java端编码演示
在Java端上实现条形码(EAN-13)和二维码(QRCode) 的编码和解码的示例,以供大家参考,用到了源码中core和javase下面的相关源代码,附件提供自己编译之后的lib包:
zxing.jarzxing-j2se.jar
- package michael.zxing;
-
- import java.io.File;
- import java.util.Hashtable;
-
- import com.google.zxing.BarcodeFormat;
- import com.google.zxing.EncodeHintType;
- import com.google.zxing.MultiFormatWriter;
- import com.google.zxing.client.j2se.MatrixToImageWriter;
- import com.google.zxing.common.BitMatrix;
- import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
-
- /**
- * [url=home.php?mod=space&uid=618199]@blog[/url] http://sjsky.iteye.com
- * @author Michael
- */
- public class ZxingEncoderHandler {
-
- /**
- * 编码
- * @param contents
- * @param width
- * @param height
- * @param imgPath
- */
- public void encode(String contents, int width, int height, String imgPath) {
- Hashtable<Object, Object> hints = new Hashtable<Object, Object>();
- // 指定纠错等级
- hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
- // 指定编码格式
- hints.put(EncodeHintType.CHARACTER_SET, "GBK");
- try {
- BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
- BarcodeFormat.QR_CODE, width, height, hints);
-
- MatrixToImageWriter
- .writeToFile(bitMatrix, "png", new File(imgPath));
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- String imgPath = "d:/1.png";
- String contents = "Hello Word!";
- int width = 300, height = 300;
- ZxingEncoderHandler handler = new ZxingEncoderHandler();
- handler.encode(contents, width, height, imgPath);
- }
- }
解码示例:
- package michael.zxing;
-
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.util.Hashtable;
-
- import javax.imageio.ImageIO;
-
- import com.google.zxing.BinaryBitmap;
- import com.google.zxing.DecodeHintType;
- import com.google.zxing.LuminanceSource;
- import com.google.zxing.MultiFormatReader;
- import com.google.zxing.Result;
- import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
- import com.google.zxing.common.HybridBinarizer;
-
- /**
- * @blog http://sjsky.iteye.com
- * @author Michael
- */
- public class ZxingDecoderHandler {
-
- /**
- * @param imgPath
- * [url=home.php?mod=space&uid=7300]@return[/url] String
- */
- public String decode(String imgPath) {
- BufferedImage image = null;
- Result result = null;
- try {
- image = ImageIO.read(new File(imgPath));
- if (image == null) {
- System.out.println("the decode image may be not exit.");
- }
- LuminanceSource source = new BufferedImageLuminanceSource(image);
- BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
-
- Hashtable<Object, Object> hints = new Hashtable<Object, Object>();
- hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
-
- result = new MultiFormatReader().decode(bitmap, hints);
- return result.getText();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- String imgPath = "d:/1.png";
- ZxingDecoderHandler handler = new ZxingDecoderHandler();
- String decodeContent = handler.decode(imgPath);
- System.out.println("解码内容如下:");
- System.out.println(decodeContent);
- }
- }
- package michael.zxing;
-
- import java.io.File;
-
- import com.google.zxing.BarcodeFormat;
- import com.google.zxing.MultiFormatWriter;
- import com.google.zxing.client.j2se.MatrixToImageWriter;
- import com.google.zxing.common.BitMatrix;
-
- /**
- * @blog http://sjsky.iteye.com
- * @author Michael
- */
- public class ZxingEAN13EncoderHandler {
-
- /**
- * 编码
- * @param contents
- * @param width
- * @param height
- * @param imgPath
- */
- public void encode(String contents, int width, int height, String imgPath) {
- int codeWidth = 3 + // start guard
- (7 * 6) + // left bars
- 5 + // middle guard
- (7 * 6) + // right bars
- 3; // end guard
- codeWidth = Math.max(codeWidth, width);
- try {
- BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
- BarcodeFormat.EAN_13, codeWidth, height, null);
-
- MatrixToImageWriter
- .writeToFile(bitMatrix, "png", new File(imgPath));
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- String imgPath = "d:/2.png";
- // 益达无糖口香糖的条形码
- String contents = "6923450657713";
-
- int width = 105, height = 50;
- ZxingEAN13EncoderHandler handler = new ZxingEAN13EncoderHandler();
- handler.encode(contents, width, height, imgPath);
- }
- }
- package michael.zxing;
-
- import java.awt.image.BufferedImage;
- import java.io.File;
-
- import javax.imageio.ImageIO;
-
- import com.google.zxing.BinaryBitmap;
- import com.google.zxing.LuminanceSource;
- import com.google.zxing.MultiFormatReader;
- import com.google.zxing.Result;
- import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
- import com.google.zxing.common.HybridBinarizer;
-
- /**
- * @blog http://sjsky.iteye.com
- * @author Michael
- */
- public class ZxingEAN13DecoderHandler {
-
- /**
- * @param imgPath
- * @return String
- */
- public String decode(String imgPath) {
- BufferedImage image = null;
- Result result = null;
- try {
- image = ImageIO.read(new File(imgPath));
- if (image == null) {
- System.out.println("the decode image may be not exit.");
- }
- LuminanceSource source = new BufferedImageLuminanceSource(image);
- BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
-
- result = new MultiFormatReader().decode(bitmap, null);
- return result.getText();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- String imgPath = "d:/2.png";
- ZxingEAN13DecoderHandler handler = new ZxingEAN13DecoderHandler();
- String decodeContent = handler.decode(imgPath);
- System.out.println("解码内容如下:");
- System.out.println(decodeContent);
- }
- }
Android 二维码
Google一下发现,用的较多的是ZXing,据说市面上很多APK都是基于ZXing。
简介
ZXing主页 https://github.com/zxing/
ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。
貌似早期的ZXing托管在Google Code(目前已关闭,即便不关闭墙内也无法访问)上,早期版本要用到Ant,目前,最新版(3.2.0)要用到Maven。
支持格式
1D product | 1D industrial | 2D |
---|---|---|
UPC-A | Code 39 | QR Code |
UPC-E | Code 93 | Data Matrix |
EAN-8 | Code 128 | Aztec (beta) |
EAN-13 | Codabar | PDF 417 (beta) |
ITF | ||
RSS-14 | ||
RSS-Expanded |
模块
Module | Description |
---|---|
core | The core image decoding library, and test code |
javase | JavaSE-specific client code |
android | Android client Barcode Scanner |
androidtest | Android test app, ZXing Test |
android-integration | Supports integration with Barcode Scanner via Intent |
android-core | Android-related code shared among android , androidtest , glass |
glass | Simple Google Glass application |
zxingorg | The source behind zxing.org |
zxing.appspot.com | The source behind web-based barcode generator at zxing.appspot.com |
其他语言(平台)
Module | Description |
---|---|
cpp | C++ port |
iphone | iPhone client |
objc | Objective C port |
actionscript | Partial ActionScript port |
jruby | JRuby wrapper |
详见https://github.com/zxing/zxing
下载
GitHub下载,可以clone,也可以Download Zip
编译
先要有maven环境,maven环境搭建见Maven笔记(一)
mvn package
注:最新版(3.2.0)需要Android SDK(需要有ANDROID_HOME环境变量),API Level为22。
如果不想编译,可以直接去http://repo1.maven.org/maven2/com/google/zxing/core/下载对应版本的jar包。
集成到已有项目
1. 从zxing/android目录中拷贝libs目录,包含文件core-3.2.1-SNAPSHOT.jar(版本不同,文件名应该不同)
2. 从zxing/android/res中拷贝drawable、layout、raw、values、xml等目录,其中values中文件(尤其是strings.xml)可能有冲突,需要合并。
3. R cannot be resolved to a variable,需要import你的R包,如com.example.xxxx.R;
4. The import com.google.zxing.client.android.R cannot be resolved,需要将com.google.zxing.client.android.R替换成com.example.xxxx.R
5. src中添加zxing\android\src\com\google\zxing\client\android,另外,会提示CameraConfigurationUtils找不到,需要从zxing\android-core\src\main\java\com\google\zxing\client\android\camera拷贝。
6.AndroidMainfest.xml添加uses-permission,activity等,注意:因为<mainfest>节点,package的值不是com.google.zxing.client.android,在activity中,要写全部路径,如android:name="com.google.zxing.client.android.CaptureActivity"。
7. 在需要扫描的地方:Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivity(intent); //或者startActivityForResult。
Android 二维码 生成和识别 [转]
今天讲一下目前移动领域很常用的技术 —— 二维码。现在大街小巷、各大网站都有二维码的踪迹,不管是 IOS、Android、WP 都有相关支持的软件。之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解。今天主要是讲解如何使用 ZXing 库,生成和识别二维码。这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码。
1、ZXing 库介绍
这里简单介绍一下 ZXing 库。ZXing 是一个开放源码的,用 Java 实现的多种格式的 1D/2D 条码图像处理库,它包含了联系到其他语言的端口。Zxing 可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39 码、93 码。ZXing 是个很经典的条码 / 二维码识别的开源类库,以前在功能机上,就有开发者使用 J2ME 运用 ZXing 了,不过要支持 JSR-234 规范 (自动对焦) 的手机才能发挥其威力。
下面是 ZXing 的 demo 运行,我这里创建了一个二维码,内容是我博客的网址,大伙可以用微信的扫一扫功能,试一下。就可以直接打开我博客。
(PS:新建的 QQ 群,有兴趣可以加入一起讨论:Android 群:322599434)
2、ZXing 库主要类
下面给大家介绍一下,ZXing 库里面主要的类以及这些类的作用:
CaptureActivity。这个是启动 Activity 也就是扫描器。
CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
DecodeThread 解码的线程。
com.google.zxing.client.android.camera 包,摄像头控制包。
ViewfinderView 自定义的 View,就是我们看见的拍摄时中间的框框了。
3、使用 ZXing 生成二维码
下面针对二维码生成和解析做个简单介绍,至于详细的使用方法,建议大家还是自己看看源码,使用起来很简单,不过这个开源项目的代码,值得好好看看。首先给出二维码生成的方法:
//Edited by mythou
//http://www.cnblogs.com/mythou/
//要转换的地址或字符串,可以是中文
public void createQRImage(String url)
{ 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, QR_WIDTH, QR_HEIGHT, hints); int[] pixels = new int[QR_WIDTH * QR_HEIGHT]; //下面这里按照二维码的算法,逐个生成二维码的图片, //两个for循环是图片横列扫描的结果
for (int y = 0; y < QR_HEIGHT; y++)
{ for (int x = 0; x < QR_WIDTH; x++)
{ if (bitMatrix.get(x, y))
{
pixels[y * QR_WIDTH + x] = 0xff000000;
} else
{
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
} //生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT); //显示到一个ImageView上面 sweepIV.setImageBitmap(bitmap);
} catch (WriterException e)
{
e.printStackTrace();
}
}
上面就是二维码生成的方法接口,如果你只是使用者方法,很简单,只要传入一个 URL 即可,就像我截图里面一样,传入一个合法的网址即可。或者像现在一些移动 APP 的推广,把 APP 下载地址转为二维码,只要扫一下就可以下载相应的 APP。这个也是目前比较流行的 APP 的推广方式。
上面代码做的事情不多,主要是调用 ZXing 库里面 QRCodeWriter ().encode 的方法对我们传进去的 URL 进行编码,具体如何编码,这个我这里就不详细说,有兴趣可以看 ZXing 的源码。文章最后会给出 ZXing 的源码和例子代码。
4、扫描二维码获取信息
扫描获取二维码信息的工作稍微复杂一些,主要是需要编写 Camera 的使用,这个跟我们一般使用 Camera 一样,需要使用 Surfaceview 作为预览,这一部我这里就不说了,这个应该不是太复杂。对于使用过 Camera 做预览的朋友,应该是挺简单的事情。获取二维码数据的关键处理是在 Camera 的自动对焦回调函数哪里,调用 ZXing 的解码接口。
//Edited by mythou
//http://www.cnblogs.com/mythou/
private void restartPreviewAndDecode() { if (state == State.SUCCESS) {
state = State.PREVIEW;
CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
activity.drawViewfinder();
}
}
这里稍微多说一句,由于解码需要一定时间,所以 ZXing 的解码调用,都是使用了 Handler 作为线程通信机制,解码的工作都是放在独立线程里面使用的,如果你直接在主线程解码,恐怕 ANR 问题是避免不了。
//Edited by mythou
//http://www.cnblogs.com/mythou/
(state ==().requestAutoFocus(=== bundle == ?
state ===
上面是解码的线程处理不同状态的时候需要注意的地方,我们这里只看获取图像成功的地方,成功获取图片解码的实在 DecodeThread 里面实现,DecodeThread 里面解码成功后,会把数据序列化,然后保存到 Bundle 里面,我们可以直接通过 Bundle 的序列化,获取到图片数据。同时会把解码后的结果保存到 MSG 里面,然后就可以根据实际情况进行处理,例如上面代码,解码成功后,会调用一个处理函数:
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void handleDecode(final Result obj, Bitmap barcode)
{
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
AlertDialog.Builder dialog = new AlertDialog.Builder(this); if (barcode == null)
{
dialog.setIcon(null);
} else
{
Drawable drawable = new BitmapDrawable(barcode);
dialog.setIcon(drawable);
}
dialog.setTitle("扫描结果");
dialog.setMessage(obj.getText());
dialog.setNegativeButton("确定", new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{ //用默认浏览器打开扫描得到的地址
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(obj.getText());
intent.setData(content_url);
startActivity(intent);
finish();
}
});
dialog.setPositiveButton("取消", new DialogInterface.OnClickListener()
{
@Override public void onClick(DialogInterface dialog, int which)
{
finish();
}
});
dialog.create().show();
}
上面就是整个二维码的解码流程,里面因为涉及很多 Camera 的使用,所以你如果需要使用二维码识别,需要注意一下你的程序需要申请下面的权限,一般的 Camera 使用以及 Camera 的自动对焦等。
//Edited by mythou
//http://www.cnblogs.com/mythou/
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
5、结语
上面就是生成和识别二维码的关键流程和代码,有兴趣的朋友可以自己查看 ZXing 的源码,里面有很多图像分析的知识可以学习。具体使用也可以参考我下面给出的 Demo。二维码对于现在移动开发来说很是很常用的技术,所以有空可以了解一下,说不定什么时候就用上了。另外,ZXing 库除了二维码外,其实对于条形码也是支持的,只是我这里没有介绍。有需要的自己去看看源码即可。
2013-8-16
Edited by 泡泡糖
ZXing 开源项目 Google Code 地址:https://code.google.com/p/zxing/
ZXingDemo 下载:ZXingDemo2013-8-25.rar
Edited by mythou
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3280023.html
Android 二维码 生成和识别(附Demo源码)
Edited by mythou
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3280023.html
已测试 -- 绝对靠谱
今天讲一下目前移动领域很常用的技术——二维码。现在大街小巷、各大网站都有二维码的踪迹,不管是IOS、Android、WP都有相关支持的软件。之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解。今天主要是讲解如何使用ZXing库,生成和识别二维码。这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码。
1、ZXing库介绍
这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39码、93码。ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力。
下面是ZXing的demo运行,我这里创建了一个二维码,内容是我博客的网址,大伙可以用微信的扫一扫功能,试一下。就可以直接打开我博客。
2、ZXing库主要类
下面给大家介绍一下,ZXing库里面主要的类以及这些类的作用:
CaptureActivity。这个是启动Activity 也就是扫描器。
CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
DecodeThread 解码的线程。
com.google.zxing.client.android.camera 包,摄像头控制包。
ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。
3、使用ZXing生成二维码
下面针对二维码生成和解析做个简单介绍,至于详细的使用方法,建议大家还是自己看看源码,使用起来很简单,不过这个开源项目的代码,值得好好看看。首先给出二维码生成的方法:
//Edited by mythou
//http://www.cnblogs.com/mythou/
//要转换的地址或字符串,可以是中文
public void createQRImage(String url)
{
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, QR_WIDTH, QR_HEIGHT, hints);
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
//下面这里按照二维码的算法,逐个生成二维码的图片,
//两个for循环是图片横列扫描的结果
for (int y = 0; y < QR_HEIGHT; y++)
{
for (int x = 0; x < QR_WIDTH; x++)
{
if (bitMatrix.get(x, y))
{
pixels[y * QR_WIDTH + x] = 0xff000000;
}
else
{
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
//生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
//显示到一个ImageView上面
sweepIV.setImageBitmap(bitmap);
}
catch (WriterException e)
{
e.printStackTrace();
}
}
上面就是二维码生成的方法接口,如果你只是使用者方法,很简单,只要传入一个URL即可,就像我截图里面一样,传入一个合法的网址即可。或者像现在一些移动APP的推广,把APP下载地址转为二维码,只要扫一下就可以下载相应的APP。这个也是目前比较流行的APP的推广方式。
上面代码做的事情不多,主要是调用ZXing库里面QRCodeWriter().encode的方法对我们传进去的URL进行编码,具体如何编码,这个我这里就不详细说,有兴趣可以看ZXing的源码。文章最后会给出ZXing的源码和例子代码。
4、扫描二维码获取信息
扫描获取二维码信息的工作稍微复杂一些,主要是需要编写Camera的使用,这个跟我们一般使用Camera一样,需要使用Surfaceview作为预览,这一部我这里就不说了,这个应该不是太复杂。对于使用过Camera做预览的朋友,应该是挺简单的事情。获取二维码数据的关键处理是在Camera的自动对焦回调函数哪里,调用ZXing的解码接口。
//Edited by mythou//http://www.cnblogs.com/mythou/ private void restartPreviewAndDecode() {
if (state == State.SUCCESS) {
state = State.PREVIEW;
CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
activity.drawViewfinder();
}
}
这里稍微多说一句,由于解码需要一定时间,所以ZXing的解码调用,都是使用了Handler作为线程通信机制,解码的工作都是放在独立线程里面使用的,如果你直接在主线程解码,恐怕ANR问题是避免不了。
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void handleMessage(Message message) {
switch (message.what) {
case R.id.auto_focus:
//Log.d(TAG, "Got auto-focus message");
// When one auto focus pass finishes, start another. This is the closest thing to
// continuous AF. It does seem to hunt a bit, but I''m not sure what else to do.
if (state == State.PREVIEW) {
CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
}
break;
case R.id.restart_preview:
Log.d(TAG, "Got restart preview message");
restartPreviewAndDecode();
break;
case R.id.decode_succeeded:
//解码成功,获取到界面的结果和原来的二维码数据
Log.d(TAG, "Got decode succeeded message");
state = State.SUCCESS;
Bundle bundle = message.getData();
Bitmap barcode = bundle == null ? null :
(Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
activity.handleDecode((Result) message.obj, barcode);
break;
case R.id.decode_failed:
// We''re decoding as fast as possible, so when one decode fails, start another.
state = State.PREVIEW;
CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
break;
case R.id.return_scan_result:
Log.d(TAG, "Got return scan result message");
activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
activity.finish();
break;
case R.id.launch_product_query:
Log.d(TAG, "Got product query message");
String url = (String) message.obj;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
activity.startActivity(intent);
break;
}
}
上面是解码的线程处理不同状态的时候需要注意的地方,我们这里只看获取图像成功的地方,成功获取图片解码的实在DecodeThread里面实现,DecodeThread里面解码成功后,会把数据序列化,然后保存到Bundle里面,我们可以直接通过Bundle的序列化,获取到图片数据。同时会把解码后的结果保存到MSG里面,然后就可以根据实际情况进行处理,例如上面代码,解码成功后,会调用一个处理函数:
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void handleDecode(final Result obj, Bitmap barcode)
{
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
if (barcode == null)
{
dialog.setIcon(null);
}
else
{
Drawable drawable = new BitmapDrawable(barcode);
dialog.setIcon(drawable);
}
dialog.setTitle("扫描结果");
dialog.setMessage(obj.getText());
dialog.setNegativeButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//用默认浏览器打开扫描得到的地址
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(obj.getText());
intent.setData(content_url);
startActivity(intent);
finish();
}
});
dialog.setPositiveButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
finish();
}
});
dialog.create().show();
}
上面就是整个二维码的解码流程,里面因为涉及很多Camera的使用,所以你如果需要使用二维码识别,需要注意一下你的程序需要申请下面的权限,一般的Camera使用以及Camera的自动对焦等。
//Edited by mythou//http://www.cnblogs.com/mythou/ <uses-permission android:name="android.permission.CAMERA"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
ZXing开源项目Google Code地址:https://code.google.com/p/zxing/
ZXingDemo下载:ZXingDemo2013-8-25.rar
今天的关于[php] 二维码和PHP二维码生成的分享已经结束,谢谢您的关注,如果想了解更多关于Android ZXing 二维码、条形码扫描介绍、Android 二维码、Android 二维码 生成和识别 [转]、Android 二维码 生成和识别(附Demo源码)的相关知识,请在本站进行查询。
本文标签: