二维码识别源代码
- 格式:docx
- 大小:41.11 KB
- 文档页数:10
find_data_code_2d中文详解
find_data_code_2d是一种二维码识别技术,它可以通过扫描二维码获取其中包含的信息。
在扫描二维码时,设备会自动识别二维码中的数据,然后将这些数据转换为可读的格式。
二维码中可以包含各种类型的数据,例如数字、文本、网址等。
在使用find_data_code_2d时,需要使用相应的扫描工具或应用程序。
使用这些工具时,用户只需要将二维码对准摄像头,扫描仪会自动读取二维码中的数据。
读取成功后,用户可以通过相关的应用程序或工具查看二维码中的内容,如文本、网址、联系人信息、事件等。
除了扫描二维码外,find_data_code_2d还可以用于生成二维码。
如果用户需要将某种信息分享给别人,可以使用二维码生成工具生成一个二维码,并将其分享给需要的人。
这个过程非常简单,只需要输入要分享的信息,选择生成二维码的类型,并点击生成按钮即可。
生成的二维码可以保存到本地,也可以直接分享给其他人。
总之,find_data_code_2d是一种十分实用的技术,它可以帮助我们快速扫描二维码获取信息,也可以用于生成二维码分享信息。
无论是在工作中还是生活中,都可以使用这种技术方便地处理各种信息。
- 1 -。
C#⽣成⼆维码QRCoder最近项⽬上有个需求,需要将某个⽂件的下载地址⽣成⼆维码,并展⽰到⽹页上.⽬前⽹上⽣成⼆维码的⽅法有好⼏种,本⽂将介绍【QRCoder】⽣成⼆维码的⽅式⼀、⾸先通过VS中的【NUGET】下载并引⽤QRCoder.dll 使⽤VS打开项⽬,项⽬->右键->管理Nuget程序包,然后选择联机,在输⼊框中输⼊QRCoder,如下图所⽰:⼆、编写⽣成⼆维码代码,并返回⾄页⾯1、WebFrom (项⽬框架)2、功能场景:客户端浏览器使⽤jQuery.ajax 请求服务端返回⼆维码,服务端通过⼀般处理程序Handler.ashx 处理客户端请求并返回⼆维码⾄客户端// ⽣成⼆维码的内容string strCode = "";QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();QRCodeData qrCodeData = qrGenerator.CreateQrCode(strCode, QRCodeGenerator.ECCLevel.Q);QRCode qrcode = new QRCode(qrCodeData);// qrcode.GetGraphic ⽅法可参考最下发“补充说明”Bitmap qrCodeImage = qrcode.GetGraphic(5,Color.Black,Color.White,null,15,6,false); MemoryStream ms = new MemoryStream();qrCodeImage.Save(ms, ImageFormat.Jpeg);// 如果想保存图⽚可使⽤ qrCodeImage.Save(filePath);// 响应类型context.Response.ContentType = "image/Jpeg";//输出字符流context.Response.BinaryWrite(ms.ToArray());以上为QRCoder⽣成⼆维码的核⼼代码补充说明:QRCode.GetGraphic⽅法参数说明 Bitmap qrCodeImage = qrcode.GetGraphic(5,Color.Black,Color.White,null,15,6,false); /* GetGraphic⽅法参数说明public Bitmap GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, Bitmap icon = null, int iconSizePercent = 15, int iconBorderWidth = 6, bool drawQuietZones = true) *int pixelsPerModule:⽣成⼆维码图⽚的像素⼤⼩,我这⾥设置的是5*Color darkColor:暗⾊⼀般设置为Color.Black ⿊⾊*Color lightColor:亮⾊⼀般设置为Color.White ⽩⾊*Bitmap icon :⼆维码⽔印图标例如:Bitmap icon = new Bitmap(context.Server.MapPath("~/images/zs.png")); 默认为NULL ,加上这个⼆维码中间会显⽰⼀个图标*int iconSizePercent:⽔印图标的⼤⼩⽐例,可根据⾃⼰的喜好设置*int iconBorderWidth:⽔印图标的边框*bool drawQuietZones:静⽌区,位于⼆维码某⼀边的空⽩边界,⽤来阻⽌读者获取与正在浏览的⼆维码⽆关的信息即是否绘画⼆维码的空⽩边框区域默认为true */。
jQuery实现微信长按识别⼆维码功能最近⼀直在搞⼀个微信开发的项⽬,终于快要完⼯了,今天⼩编抽个时间记录下在项⽬开发过程中遇到jquery.qrcode.min.js⽣成⼆维码长按不识别的解决⽅法,希望对⼤家有所帮助!1.引⼊JS库<script src="jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script><script src="jquery.qrcode.min.js" type="text/javascript" charset="utf-8"></script>2.在页⾯创建⼀个空的div;<div id="qrDiv"></div>3.⽣成⼆维码$("#qrDiv").qrcode({width: 120, //宽度height:120, //⾼度text: "需要⽣成的⼆维码内容" //任意内容});注意:这个时候⽣成的⼆维码在微信中长安没任何反应,因为qrcode⽣成的是canvas标签⽽不是img标签4.将canvas标签转换为img标签//从 canvas 提取图⽚ imagefunction convertCanvasToImage(canvas) {//新Image对象,可以理解为DOMvar image = new Image();// canvas.toDataURL 返回的是⼀串Base64编码的URL,当然,浏览器⾃⼰肯定⽀持// 指定格式 PNGimage.src = canvas.toDataURL("image/png");return image;}//获取⽹页中的canvas对象var mycanvas1=document.getElementsByTagName('canvas')[0];//将转换后的img标签插⼊到html中var img=convertCanvasToImage(mycanvas1);$('#imagQrDiv').append(img);//imagQrDiv表⽰你要插⼊的容器id注意:完成上述步骤后就可以在微信中长按识别了以上所述是⼩编给⼤家介绍的jQuery实现微信长按识别⼆维码功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
ZXing⽣成、读取⼆维码(带logo) 前⾔ ZXing,⼀个⽀持在图像中解码和⽣成条形码(如⼆维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。
ZXing(“zebra crossing”)是⼀个开源的、多格式的、⽤Java实现的⼀维/⼆维条码图像处理库,具有到其他语⾔的端⼝。
代码编写 maven 我们是java端,所以需要引这两个<!-- ZXing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version></dependency> Test.javapublic class Test{public static void main(String[] args) {try {QREncode();QRReader(new File("D:\\zxing1.gif"));} catch (WriterException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (NotFoundException e) {e.printStackTrace();}}/*** ⽣成⼆维码*/public static void QREncode() throws WriterException, IOException {String content = "个⼈博客:https:///huanzi-qch/";//⼆维码内容int width = 200; // 图像宽度int height = 200; // 图像⾼度String format = "gif";// 图像类型Map<EncodeHintType, Object> hints = new HashMap<>();//内容编码格式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 指定纠错等级hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//设置⼆维码边的空度,⾮负数hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);MatrixToImageWriter.writeToPath(bitMatrix, format, new File("D:\\zxing.gif").toPath());// 输出原图⽚MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);/*问题:⽣成⼆维码正常,⽣成带logo的⼆维码logo变成⿊⽩原因:MatrixToImageConfig默认⿊⽩,需要设置BLACK、WHITE解决:https:///blog/2254382*/BufferedImage bufferedImage = LogoMatrix(MatrixToImageWriter.toBufferedImage(bitMatrix,matrixToImageConfig), new File("D:\\logo.png"));// BufferedImage bufferedImage = LogoMatrix(toBufferedImage(bitMatrix), new File("D:\\logo.png"));ImageIO.write(bufferedImage, "gif", new File("D:\\zxing1.gif"));//输出带logo图⽚System.out.println("输出成功.");}/*** 识别⼆维码*/public static void QRReader(File file) throws IOException, NotFoundException {MultiFormatReader formatReader = new MultiFormatReader();//读取指定的⼆维码⽂件BufferedImage bufferedImage =ImageIO.read(file);BinaryBitmap binaryBitmap= new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(bufferedImage)));//定义⼆维码参数Map hints= new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");com.google.zxing.Result result = formatReader.decode(binaryBitmap, hints);//输出相关的⼆维码信息System.out.println("解析结果:"+result.toString());System.out.println("⼆维码格式类型:"+result.getBarcodeFormat());System.out.println("⼆维码⽂本内容:"+result.getText());bufferedImage.flush();}/*** ⼆维码添加logo* @param matrixImage 源⼆维码图⽚* @param logoFile logo图⽚* @return返回带有logo的⼆维码图⽚* 参考:https:///weixin_39494923/article/details/79058799*/public static BufferedImage LogoMatrix(BufferedImage matrixImage, File logoFile) throws IOException{/*** 读取⼆维码图⽚,并构建绘图对象*/Graphics2D g2 = matrixImage.createGraphics();int matrixWidth = matrixImage.getWidth();int matrixHeigh = matrixImage.getHeight();/*** 读取Logo图⽚*/BufferedImage logo = ImageIO.read(logoFile);//开始绘制图⽚g2.drawImage(logo,matrixWidth/5*2,matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5, null);//绘制BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);g2.setStroke(stroke);// 设置笔画对象//指定弧度的圆⾓矩形RoundRectangle2D.Float round = new RoundRectangle2D.Float(matrixWidth/5*2, matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5,20,20);g2.setColor(Color.white);g2.draw(round);// 绘制圆弧矩形//设置logo 有⼀道灰⾊边框BasicStroke stroke2 = new BasicStroke(1,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);g2.setStroke(stroke2);// 设置笔画对象RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(matrixWidth/5*2+2, matrixHeigh/5*2+2, matrixWidth/5-4, matrixHeigh/5-4,20,20); g2.setColor(new Color(128,128,128));g2.draw(round2);// 绘制圆弧矩形g2.dispose();matrixImage.flush() ;return matrixImage ;}} 效果演⽰ D盘⽂件 查看图⽚ 后台识别、微信扫描结果 后记 但是qrcode默认不⽀持⾃定义logo,怎么办呢?两种⽅法: 1、创建⼀个img标签,调整样式,让logo在⼆维码区域上居中显⽰ 2、创建⼀个canvas画布,将⼆维码跟logo重新绘制,让logo在⼆维码区域上居中显⽰ 补充 2020-02-25补充:实现⼆维码输出到浏览器功能 1、⽣成⼆维码时,不是直接保存成图⽚,⽽是返回BufferedImage/*** ⽣成⼆维码*/public static BufferedImage QREncode(String content){int width = 250; // 图像宽度int height = 250; // 图像⾼度Map<EncodeHintType, Object> hints = new HashMap<>();//内容编码格式hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 指定纠错等级hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//设置⼆维码边的空度,⾮负数hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = null;BufferedImage bufferedImage = null;try {bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix,matrixToImageConfig);} catch (WriterException e) {e.printStackTrace();}//⽆logo//return bufferedImage;//带logo,System.getProperty("user.dir")是项⽬⼯程根路径assert bufferedImage != null;return LogoMatrix(bufferedImage,new File(System.getProperty("user.dir") + "\\src\\main\\resources\\static\\img\\logo.png"));} 2、新增controller,供web调⽤//获取⼆维码图⽚@GetMapping("getBarCodeImage/{id}")public void getBarCodeImage(@PathVariable("id") String id) throws IOException {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();//设置页⾯不缓存assert response != null;response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);response.getOutputStream();//设置输出的内容的类型为JPEG图像response.setContentType("image/jpeg");//通过id查询数据设置⼆维码内容String text = "{\"id\":\""+ id +"\"}"BufferedImage bufferedImage = QREncode(text);//写给浏览器ImageIO.write(bufferedImage, "JPEG", response.getOutputStream());}3、web页⾯调⽤,thymeleaf语法<img id="barCodeImage" th:src="@{'/getBarCodeImage/' + ${id}}"/><br/><br/><button th:onclick="${'document.getElementById(''barCodeImage'').src = ctx + ''/getBarCodeImage/'+ id +'?time='' + new Date().getTime()'}">刷新⼆维码</button>。
Java利⽤zxing⽣成解析⼆维码QRCode:全称Quick Response Code ,是⼆维码的⼀种2. 编写⽣成⼆维码的实现代码import java.io.File;import java.nio.file.Path;import java.util.HashMap;import java.util.Map;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.client.j2se.MatrixToImageWriter;import mon.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class CreateQRCode {public static void main(String[] args) {/*定义⼆维码参数*/String content = "https:///zxing/zxing/releases";// ⼆维码内容Map hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 纠错等级hints.put(EncodeHintType.MARGIN, 2);// 边距,默认是5/*⽣成⼆维码*/try {MultiFormatWriter multiFormatWriter = new MultiFormatWriter();/*⼆维码类型QR_CODE,是图⽚宽度和⾼度是300*300*/BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300, hints);Path path = new File("C:/Users/Administrator/Desktop/img.png").toPath();// ⼆维码存放的路径和名称MatrixToImageWriter.writeToPath(bitMatrix, "png", path);//图⽚是png类型} catch (Exception e) {e.printStackTrace();}}}纠错能⼒越⾼,存储的数据越少,对⼆维码的清晰度要求越低。
)编译结果如下:D:\Java\zxing-1.6\core>antBuildfile: build.xmlclean:build:init:compile:[mkdir] Created dir: D:\Java\zxing-1.6\core\build[javac] Compiling 171 source files to D:\Java\zxing-1.6\core\build [jar] Building jar: D:\Java\zxing-1.6\core\core.jarBUILD SUCCESSFULTotal time: 6 seconds编译之后得到core.jar这个包。
再进入D:\Java\zxing-1.6\javase目录使用ant进行编译,编译结果如下:D:\Java\zxing-1.6\javase>antBuildfile: build.xmlinit:build:[mkdir] Created dir: D:\Java\zxing-1.6\javase\build[javac] Compiling 6 source files to D:\Java\zxing-1.6\javase\build [jar] Building jar: D:\Java\zxing-1.6\javase\javase.jarBUILD SUCCESSFULTotal time: 1 second编译之后得到javase.jar这个包。
在Eclipse里新建Java工程:编写java代码如下:package com.lizongbo.qrcode;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.Hashtable;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.WriterException;import com.google.zxing.client.j2se.MatrixToImageWriter;import mon.BitMatrix;public class QRCodeGen {private static final int BLACK = 0xFF000000;private static final int WHITE = 0xFFFFFFFF;/*** @param args* @throws WriterException* @throws IOException*/public static void main(String[] args) throws WriterException, IOException { String picFormat = “png”;StringBuilder sb = new StringBuilder(1024);java.io.InputStreamReader fr = new InputStreamReader(new FileInputStream(“d:\\quickli.vcf”), “GBK”);BufferedReader br = new BufferedReader(fr);String line = null;while ((line = br.readLine()) != null) {sb.append(line).append(“\r\n”);}String str = sb.toString();// 二维码内容System.out.println(str.length() + “|str==” + str);str = new String(str.getBytes(“GBK”), “ISO-8859-1″);String path = “d:/lzb”;Hashtable hints = new Hashtable();// hints.put(EncodeHintType.CHARACTER_SET, “GBK”);BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, 400, 400, hints);/*** begin 这段代码等同于就是MatrixToImageWriter.writeToFile(bitMatrix, picFormat,* file);* 直接这样写就不用引用javase.jar*/int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);}}File file = new Fil e(path + “.” + picFormat);ImageIO.write(image, picFormat, file);/*** end 这段代码等同于就是MatrixToImageWriter.writeToFile(bitMatrix, picFormat,* file);*/MatrixToImageWriter.writeToFile(bitMatrix, picFormat, file);}}网址的QRcode生成如果不想编写代码,可以使用现成的google的api:/chart?chs=150×150&cht=qr&chl=http://zxing.googleco /files/BarcodeScanner3.5.2.apk&chld=L|1&choe=UTF-8Vcard也可以生成QRcode:参考:/archives/686在线对二维码进行解码的url:/w/decode.jspx在Webview中通过js也可以调用条形码扫描,封装的java代码如下:final class BarCodeUtilHandler {public void tryGetBarCode() {Intent intent = new Intent(“com.google.zxing.client.android.SCAN”);// intent.putExtra(“SCAN_MODE”, “QR_CODE_MODE”);startActivityForResult(intent, 0);}};@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent intent) { Log.v(TAG, “onActivityResult===” + requestCode + “,” + resultCode + “,”+ intent);if (requestCode == 0) {if (resultCode == RESULT_OK) {String contents = intent.getStringExtra(“SCAN_RESULT”);String format = intent.getStringExtra(“SCAN_RESULT_FORMAT”); webview.loadUrl(“javascript:showBarCode(\‟” + format + “|”+ contents + “\‟)”);} else if (resultCode == RESULT_CANCELED) {webview.loadUrl(“javascript:showBarCode(\‟没有找到条码!\‟)”);}}}//webvie w.addJavascriptInterface(new BarCodeUtilHandler(), “barcodeutil”); //javascript调用:window.barcodeutil.tryGetBarCode();//function showBarCode(str) {// try {// document.getElementById(…data‟).value=str;// } catch (ee) {// }//}Tags: Android, QRCode, zxing, 二维码, 条形码标签:Android, QRCode, zxing, 二维码, 条形码。
Python生成二维码和验证码(附源码和视频,免费赠书)要用Python生成二维码,首先需要下载一个Python的二维码库qrcode。
qrcode库是用于生成二维码图像的Python第三方库。
qrcode二维码生成包安装如下(在命令行cmd中):C:\> pipinstall qrcode生成二维码图像同时依赖于PIL库。
PIL(PythonImaging Library,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。
PIL是Python语言的第三方库,安装PIL库的方法如下,需要安装库的名字是pillow。
C:\> pipinstall pillow 或者 pip3install pillowPIL 库支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条和文字等操作。
二维码生成和解析程序设计的步骤1. 生成带有图标的二维码事先准备一个logo图标'logo.png'使用下面程序生成带有logo图标的二维码。
import qrcodefrom PIL import Imageimport os, sysdef gen_qrcode(string, path,logo=''):'''生成中间带logo的二维码需要安装qrcode, PIL库@参数 string: 二维码字符串@参数 path: 生成的二维码保存路径@参数 logo: logo文件路径@return: None'''# 初步生成二维码图像qr =qrcode.QRCode(version=2,error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8,border=1)qr.add_data(string)qr.make(fit=True)# 获得Image实例并把颜色模式转换为RGBAimg =qr.make_imageimg =img.convert('RGBA')iflogo and os.path.exists(logo):try:icon = Image.open(logo) #打开填充的logo文件img_w, img_h = img.sizeexcept Exception as e:print(e)sys.exit(1)factor = 4#计算logo的尺寸size_w = int(img_w / factor)size_h = int(img_h / factor)#比较并重新设置logo文件的尺寸icon_w, icon_h = icon.sizeif icon_w > size_w:icon_w = size_wif icon_h > size_h:icon_h = size_hicon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)#计算logo的位置,并复制到二维码图像中w= int((img_w - icon_w) / 2)h= int((img_h - icon_h) / 2)icon = icon.convert('RGBA')img.paste(icon, (w, h), icon)#保存二维码img.save(path) #如'qrcode.png'if __name__ == '__main__':info= ' 'pic_path = 'qrcode.png' #生成的带有图标二维码图片logo_path = 'logo.png' #用于填充的图标gen_qrcode(info, pic_path,logo_path )生成的带有图标二维码图片qrcode.png2. Python解析二维码图片解析二维码图片的信息需要使用zbarlight(二维码解析包),zbarlight安装如下:pip install zbarlight注意zbarlight二维码解析包仅仅支持Python2.7以下。
Android平台下利用zxing实现二维码开发现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发。
1.如何将zxing的Android源码导入工程。
在导入zxing的android源码之前,先去官方下载zxing的源码:/p/zxing/downloads/list。
我这里下载的是1.6版本的,我试验了几个版本,发现2.0以后的版本实际用起来没有1.6和1.7版本的好用,最后选择了1.6版本。
zxing 1.6源码结构如下:其中android文件夹就是android平台下的官方例子。
在导入之前先要对core文件下的源码进行编译,得到核心包core.jar。
编译方法请参照:/yimigao@126/blog/static/671560502011611111116747/然后就可以导入android平台下的例子了,导入方法如下:1)打开Eclipse,新建android项目:(注意不要直接把android文件夹拷到workspace下导入,那样会无法导入)2)导入核心包core.jar。
3)修改strings.xml文件。
在导入core.jar之后工程还是会有错误:出现这种错误可能是由于字符错误导致的,只需要把所有的%s 和%f改成 %1s和f 即可。
修改完之后重新清理项目,此时已经没有错误了:4)运行效果:2.代码简化上面代码中,很多功能我们在自己的项目中都用不到,因此需要对其进行简化,至于如何简化这里就不赘述了,网上有很多教程。
下面只给出简化后的结果:如果只进行二维码识别和二维码生成的话,只需要上面包中的文件。
其中CaptureActivity.java是拍照取景的类,camera包下面的类主要与照相机相关的类,decoding和encoding是解码和编码相关的类,view是取景框相关的类。
python⽣成⼆维码的实例详解python⽣成⼆维码的实例详解版本相关操作系统:Mac OS X EI CaptionPython版本:2.7IDE:Sublime Text 3依赖库Python⽣成⼆维码需要的依赖库为PIL和QRcode。
坑爹的是,百度了好久都没有找到PIL,不知道是什么时候改名了,还是其他原因,pillow就是传说中的PIL。
安装命令:sudo pip install pillow、sudo pip install qrcode验证是否安装成功,使⽤命令from PIL import Image,就可以验证PIL是否安装成功,qrcode则使⽤import qrcode,两条命令不报错,就说明依赖的环境已经完毕了。
使⽤qrcodeqrcode使⽤起来也很简单,代码如下:import qrcodeqr = qrcode.QRCode(version=7,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4)qr.add_data("Hello")qr.make(fit=True)img = qr.make_image()img.save("test.png")参数 version 表⽰⽣成⼆维码的尺⼨⼤⼩,取值范围是 1 ⾄ 40,最⼩尺⼨ 1 会⽣成 21 * 21 的⼆维码,version 每增加 1,⽣成的⼆维码就会添加 4 尺⼨,例如 version 是 2,则⽣成 25 * 25 的⼆维码。
参数 error_correction 指定⼆维码的容错系数,分别有以下4个系数:1.ERROR_CORRECT_L: 7%的字码可被容错2.ERROR_CORRECT_M: 15%的字码可被容错3.ERROR_CORRECT_Q: 25%的字码可被容错4.ERROR_CORRECT_H: 30%的字码可被容错参数 box_size 表⽰⼆维码⾥每个格⼦的像素⼤⼩。
android利⽤ZXING扫描⼆维码代码分析之前给公司做了⼀个摄影相关的应⽤,现在要添加⼆维码扫描的功能,⽹上找资料后,虽然已经成功集成到app⾥⾯,但是总感觉⼼⾥没底⼉。
所以趁这段时间不是很忙,总结⼀下。
⾸先是启动扫描的UI类:1,Activity启动,当然是onCreate⽅法private CaptureActivityHandler handler;private ViewfinderView viewfinderView;private boolean hasSurface;private Vector<BarcodeFormat> decodeFormats;private String characterSet;private InactivityTimer inactivityTimer;private MediaPlayer mediaPlayer;private boolean playBeep;private static final float BEEP_VOLUME = 0.10f;private boolean vibrate;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_capture);// ViewUtil.addTopView(getApplicationContext(), this,// R.string.scan_card);CameraManager.init(getApplication());viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);Button mButtonBack = (Button) findViewById(R.id.button_back);mButtonBack.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Scaner.this.finish();}});hasSurface = false;inactivityTimer = new InactivityTimer(this);}@Overrideprotected void onResume() {super.onResume();SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);SurfaceHolder surfaceHolder = surfaceView.getHolder();if (hasSurface) {initCamera(surfaceHolder);} else {surfaceHolder.addCallback(this);surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}decodeFormats = null;characterSet = null;playBeep = true;AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {playBeep = false;}initBeepSound();vibrate = true;}@Overrideprotected void onPause() {super.onPause();if (handler != null) {handler.quitSynchronously();handler = null;}CameraManager.get().closeDriver();}@Overrideprotected void onDestroy() {inactivityTimer.shutdown();super.onDestroy();}/****** @param @param result* @param @param barcode* @author Administrator* @return void*/public void handleDecode(Result result, Bitmap barcode) {inactivityTimer.onActivity();playBeepSoundAndVibrate();String resultString = result.getText();if (resultString.equals("")) {Toast.makeText(Scaner.this, "Scan failed!",3000).show();} else {//查询keycode 本地数据库 1,优先查询本地库,2,没有本地库,直接跳到知道链接//分析出keyCodeLog.i("testMain","scan_result=====>"+resultString);String keyCode="";String[] split1;if(stIndexOf("?")<0){Intent intent = new Intent(this, InnerBrowser.class);Bundle bundle = new Bundle();bundle.putString("result", resultString);//bundle.putParcelable("bitmap", barcode);intent.putExtras(bundle);startActivity(intent);Scaner.this.finish();return;}String[] attr = resultString.substring(stIndexOf("?")-1, resultString.length()).split("&"); for (String string : attr) {split1 = string.split("=");if(split1[0].equalsIgnoreCase("keycode")){//找到if(split1.length==2){keyCode=split1[1];}}}Log.i("testMain","keyCode=====>"+keyCode);if(!StringUtils.isBlank(keyCode)){AttractionDAO dao=new AttractionDAO(Scaner.this);Attraction a=dao.findAttrByKeyCode(keyCode);Log.i("testMain","a=====>"+a);if(a!=null){Intent it=new Intent();it.setClass(Scaner.this, UIAttractionDetail.class);it.putExtra("a", a);startActivity(it);}else{Intent intent = new Intent(this, InnerBrowser.class);Bundle bundle = new Bundle();bundle.putString("result", resultString);//bundle.putParcelable("bitmap", barcode);intent.putExtras(bundle);startActivity(intent);//this.setResult(RESULT_OK, resultIntent);//使⽤内置浏览器打开⽹站内容}}else{Intent intent = new Intent(this, InnerBrowser.class);Bundle bundle = new Bundle();bundle.putString("result", resultString);//bundle.putParcelable("bitmap", barcode);intent.putExtras(bundle);startActivity(intent);//this.setResult(RESULT_OK, resultIntent);//使⽤内置浏览器打开⽹站内容}}Scaner.this.finish();}private void initCamera(SurfaceHolder surfaceHolder) {try {CameraManager.get().openDriver(surfaceHolder);} catch (IOException ioe) {return;} catch (RuntimeException e) {return;}if (handler == null) {handler = new CaptureActivityHandler(this, decodeFormats,characterSet);}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (!hasSurface) {hasSurface = true;initCamera(holder);}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {hasSurface = false;}public ViewfinderView getViewfinderView() {return viewfinderView;}public Handler getHandler() {return handler;}public void drawViewfinder() {viewfinderView.drawViewfinder();}private void initBeepSound() {if (playBeep && mediaPlayer == null) {// The volume on STREAM_SYSTEM is not adjustable, and users found it// too loud,// so we now play on the music stream.setVolumeControlStream(AudioManager.STREAM_MUSIC);mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setOnCompletionListener(beepListener);AssetFileDescriptor file = getResources().openRawResourceFd(R.raw.beep);try {mediaPlayer.setDataSource(file.getFileDescriptor(),file.getStartOffset(), file.getLength());file.close();mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);mediaPlayer.prepare();} catch (IOException e) {mediaPlayer = null;}}}private static final long VIBRATE_DURATION = 200L;private void playBeepSoundAndVibrate() {if (playBeep && mediaPlayer != null) {mediaPlayer.start();}if (vibrate) {Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);vibrator.vibrate(VIBRATE_DURATION);}}/*** When the beep has finished playing, rewind to queue up another one.*/private final OnCompletionListener beepListener = new OnCompletionListener() {public void onCompletion(MediaPlayer mediaPlayer) {mediaPlayer.seekTo(0);}};从上⾯代码可以看出,做了三件事⼉:加载布局⽂件;初始化了⼀个相机管理器;设置按钮监听,初始化了⼀个InactivityTimer实例;然后,最重要的是他实现了⼀个CallBack函数:具体参见:译⽂此时,surfaceCreated这个⽅法会调⽤然后就初始化相机的⼀些参数:前两个我们好理解,第三个是⼲嘛的?我们先看布局⽂件:<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent" ><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent" ><SurfaceViewandroid:id="@+id/preview_view"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="center" /><com.euc.app.scan.view.ViewfinderViewandroid:id="@+id/viewfinder_view"android:layout_width="wrap_content"android:layout_height="wrap_content" /><includeandroid:id="@+id/include1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"layout="@layout/activity_title" /></RelativeLayout></FrameLayout>可以看到⾥⾯有⼀个⾃定义的View及surfaceView,对于我这样的初学者来说,surfaceView 是什么东西?csdn上看到这个⽂章虽然不是很明⽩,但是⼤致明⽩这是个什么东西了。
QRCode Decode using System; using System.Text;
using QRCodeImage = ThoughtWorks.QRCode.Codec.Data.QRCodeImage; using QRCodeSymbol = ThoughtWorks.QRCode.Codec.Data.QRCodeSymbol; using ReedSolomon = ThoughtWorks.QRCode.Codec.Ecc.ReedSolomon; using DecodingFailedException = ThoughtWorks.QRCode.ExceptionHandler.DecodingFailedException; using InvalidDataBlockException = ThoughtWorks.QRCode.ExceptionHandler.InvalidDataBlockException; using SymbolNotFoundException = ThoughtWorks.QRCode.ExceptionHandler.SymbolNotFoundException; using Point = ThoughtWorks.QRCode.Geom.Point; using QRCodeDataBlockReader = ThoughtWorks.QRCode.Codec.Reader.QRCodeDataBlockReader; using QRCodeImageReader = ThoughtWorks.QRCode.Codec.Reader.QRCodeImageReader; using DebugCanvas = ThoughtWorks.QRCode.Codec.Util.DebugCanvas; using DebugCanvasAdapter = ThoughtWorks.QRCode.Codec.Util.DebugCanvasAdapter; using QRCodeUtility = ThoughtWorks.QRCode.Codec.Util.QRCodeUtility;
namespace ThoughtWorks.QRCode.Codec {
public class QRCodeDecoder { internal QRCodeSymbol qrCodeSymbol; internal int numTryDecode; internal System.Collections.ArrayList results; internal System.Collections.ArrayList lastResults = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10)); internal static DebugCanvas canvas; internal QRCodeImageReader imageReader; internal int numLastCorrections; internal bool correctionSucceeded;
public static DebugCanvas Canvas { get { return QRCodeDecoder.canvas; }
set { QRCodeDecoder.canvas = value; }
} virtual internal Point[] AdjustPoints { get { // note that adjusts affect dependently // i.e. below means (0,0), (2,3), (3,4), (1,2), (2,1), (1,1), (-1,-1) // Point[] adjusts = {new Point(0,0), new Point(2,3), new Point(1,1), // new Point(-2,-2), new Point(1,-1), new Point(-1,0), new Point(-2,-2)}; System.Collections.ArrayList adjustPoints = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10)); for (int d = 0; d < 4; d++) adjustPoints.Add(new Point(1, 1)); int lastX = 0, lastY = 0; for (int y = 0; y > - 4; y--) { for (int x = 0; x > - 4; x--) { if (x != y && ((x + y) % 2 == 0)) { adjustPoints.Add(new Point(x - lastX, y - lastY)); lastX = x; lastY = y; } } } Point[] adjusts = new Point[adjustPoints.Count]; for (int i = 0; i < adjusts.Length; i++) adjusts[i] = (Point) adjustPoints[i]; return adjusts; } }
internal class DecodeResult { internal int numCorrections; internal bool correctionSucceeded; internal sbyte[] decodedBytes; private QRCodeDecoder enclosingInstance;
public DecodeResult(QRCodeDecoder enclosingInstance, sbyte[] decodedBytes, int numErrors, bool correctionSucceeded) { InitBlock(enclosingInstance); this.decodedBytes = decodedBytes; this.numCorrections = numErrors; this.correctionSucceeded = correctionSucceeded; }
private void InitBlock(QRCodeDecoder enclosingInstance) { this.enclosingInstance = enclosingInstance; }
virtual public sbyte[] DecodedBytes { get { return decodedBytes; }
} virtual public int NumErrors { get { return numCorrections; }
} virtual public bool CorrectionSucceeded { get { return correctionSucceeded; }
} public QRCodeDecoder Enclosing_Instance { get { return enclosingInstance; }
} } public QRCodeDecoder() { numTryDecode = 0; results = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10)); QRCodeDecoder.canvas = new DebugCanvasAdapter(); }
/* public byte[] decode(QRCodeImage qrCodeImage) throws DecodingFailedException{ canvas.println("Decoding started."); int[][] intImage = imageToIntArray(qrCodeImage); try { QRCodeImageReader reader = new QRCodeImageReader(); qrCodeSymbol = reader.getQRCodeSymbol(intImage); } catch (SymbolNotFoundException e) { throw new DecodingFailedException(e.getMessage()); } canvas.println("Created QRCode symbol."); canvas.println("Reading symbol."); canvas.println("Version: " + qrCodeSymbol.getVersionReference()); canvas.println("Mask pattern: " + qrCodeSymbol.getMaskPatternRefererAsString()); int[] blocks = qrCodeSymbol.getBlocks(); canvas.println("Correcting data errors."); int[] dataBlocks = correctDataBlocks(blocks); try { byte[] decodedByteArray = getDecodedByteArray(dataBlocks, qrCodeSymbol.getVersion()); canvas.println("Decoding finished."); return decodedByteArray; } catch (InvalidDataBlockException e) { throw new DecodingFailedException(e.getMessage()); } }*/
public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage) { Point[] adjusts = AdjustPoints; System.Collections.ArrayList results = System.Collections.ArrayList.Synchronized(new System.Collections.ArrayList(10)); while (numTryDecode < adjusts.Length) { try { DecodeResult result = decode(qrCodeImage, adjusts[numTryDecode]); if (result.CorrectionSucceeded) { return result.DecodedBytes; } else { results.Add(result); canvas.println("Decoding succeeded but could not correct"); canvas.println("all errors. Retrying.."); } } catch (DecodingFailedException dfe) { if (dfe.Message.IndexOf("Finder Pattern") >= 0) throw dfe; } finally { numTryDecode += 1; } }