精华内容
下载资源
问答
  • 二维码识别工具是一款的...这个工具是给快递公司的,每个快递公司都需要二维码条码识别软件 公司企业也需要的生成自己的二维码名片,打印公司也经常用到的, 本工具由爱站之家提供,有什么不明白的可以联系我咨询!
  • 动画选项:上下对齐,网格形式移动,中线不移动(通常用于条形码扫描) 使用CocoaPods进行安装 platform :ios , '8.0' use_frameworks! pod 'swiftScan' , :git => 'https://github.com/MxABC/swift
  • 主要介绍了Android中google Zxing实现二维码条形码扫描的相关资料,需要的朋友可以参考下
  • 本项目是使用zxing项目中的二维码库做成的二维码条形码扫描器,希望对项目中要使用二维码或条形码的用户有所帮助!
  • android Zxing扫描二维码条形码功能仿微信自定义扫码框扫描线边框样式Android studio版本 源码下载
  • google二维码条形码

    2018-01-01 23:42:46
    google二维码条形码 生成,解析 google二维码条形码 生成,解析
  • SwiftScan:一种条形码二维码扫描仪二维码扫描,生成,仿微信,支付宝)
  • 基于google Zxing实现二维码条形码扫描,仿微信二维码扫描效果的实例代码
  • 谷歌 Zxing 二维码 条形 扫描 生成 demo
  • BarcodeScanner二维码扫描器安卓源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • QRcode二维码生成与扫描器(实现本地存储),加入欢迎页动画,和存储到本地
  • dewo 二维码扫描设备开发文档,lib,源代码
  • 二维码条形码扫描

    2013-08-08 16:33:43
    最近在网上找找到了一个自定义二维码条形码扫描器,扫描结果会生成一张图片和图片的相关信息。个人感觉忙好的。
  • 条码在生活中随处可见,其可分为三类:一维条码、二维条码、三维条码 一维条码: 我们平时习惯称为条形码条形码是将宽度不等的多个黑条和... 二维条码简称为二维码,常见的二维码为QR Code,QR全称Quick Resp...

    条码在生活中随处可见,其可分为三类:一维条码、二维条码、三维条码

    一维条码:

           我们平时习惯称为条形码。条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

    二维条码:

          二维条码简称为二维码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

    三维条码:

        三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。

     

    一、实现效果

               

     

    二、安装所需的库

    2.1、安装扫描库

    安装命令:pip3 install pyzbar

    其实Python的条码扫描库,一直都有一个很是出名,那就是zbar,但此库虽然牛,却已经停止维护了,如果是python3,则不能使用zbar库了,python2.7还是可以用的。忙活了一下午才发现我的python3.5不能用zbara库,哈哈蓝瘦

     

    2.2、安装其他必要库

    后续功能需要用到PIL和OpenCV-Python相关库,可参考以下链接进行简单认识和库的安装

    玩转Python图片处理(OpenCV-Python)

    Python的GUI编程(TK)

     

    三、系统环境准备

    3.1、Windows环境

     如果是Windows电脑则可以跳过。*  0  *

     

    3.2、树莓派环境

    第一步:插入并打开CSI摄像头(参考:https://www.cnblogs.com/dongxiaodong/p/9814119.html)

    第二步:配置系统启动之后加载bcm2835-v4l2这个模块,原因是树莓派中的camera module是放在/boot/目录中以固件形式加载的,不是一个标准的V4L2的摄像头驱动,所以用opencv的(cv2.VideoCapture(0)会无视频数据),加上这句之后就可以解决以上问题。

    命令:sudo vi /etc/modules

    加入:bcm2835-v4l2

     

    四、实现简单的图识别

     使用pyzbar和PIL 进行图片的二维码识别,并输出识别结果

    识别结果:

     

    找到一张二维码图片,并下载其中二维码:

    基本代码:

     1 import pyzbar.pyzbar as pyzbar
     2 from PIL import Image,ImageEnhance
     3 
     4 image = "imgx\dongxiao.png"
     5 
     6 img = Image.open(image)
     7 #处理图片
     8 #img = ImageEnhance.Brightness(img).enhance(2.0)#增加亮度
     9 
    10 #img = ImageEnhance.Sharpness(img).enhance(17.0)#锐利化
    11 
    12 #img = ImageEnhance.Contrast(img).enhance(4.0)#增加对比度
    13 
    14 #img = img.convert('L')#灰度化
    15 
    16 #显示原图,调用系统默认的图片显示器
    17 img.show()
    18 
    19 texts = pyzbar.decode(img)
    20 #输出结果
    21 for text in texts:
    22     tt = text.data.decode("utf-8")
    23     print(tt)

    五、图识别进阶

    使用pyzbar和PIL 及OpenCV-Python,实现二维码图片框选和在图片上印字体

    识别结果:

    基本代码:

     1 import cv2
     2 import pyzbar.pyzbar as pyzbar
     3 import numpy
     4 from PIL import Image, ImageDraw, ImageFont
     5 
     6 def decodeDisplay(imagex1):
     7     # 转为灰度图像
     8     gray = cv2.cvtColor(imagex1, cv2.COLOR_BGR2GRAY)
     9     barcodes = pyzbar.decode(gray)
    10 
    11     for barcode in barcodes:
    12 
    13         # 提取条形码的边界框的位置
    14         # 画出图像中条形码的边界框
    15         (x, y, w, h) = barcode.rect
    16         cv2.rectangle(imagex1, (x, y), (x + w, y + h), (255, 255, 0), 2)
    17 
    18         # 条形码数据为字节对象,所以如果我们想在输出图像上
    19         # 画出来,就需要先将它转换成字符串
    20         barcodeData = barcode.data.decode("utf-8")
    21         barcodeType = barcode.type
    22 
    23         #不能显示中文
    24         # 绘出图像上条形码的数据和条形码类型
    25         #text = "{} ({})".format(barcodeData, barcodeType)
    26         #cv2.putText(imagex1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,5, (0, 0, 125), 2)
    27 
    28         #更换为:
    29         img_PIL = Image.fromarray(cv2.cvtColor(imagex1, cv2.COLOR_BGR2RGB))
    30 
    31         # 参数(字体,默认大小)
    32         font = ImageFont.truetype('fontx/hwst.ttf', 25)
    33         # 字体颜色(rgb)
    34         fillColor = (255,0,0)
    35         # 文字输出位置
    36         position = (x, y-10)
    37         # 输出内容
    38         str = barcodeData
    39 
    40         # 需要先把输出的中文字符转换成Unicode编码形式(  str.decode("utf-8)   )
    41 
    42         draw = ImageDraw.Draw(img_PIL)
    43         draw.text(position, str, font=font, fill=fillColor)
    44         # 使用PIL中的save方法保存图片到本地
    45         # img_PIL.save('02.jpg', 'jpeg')
    46 
    47         # 转换回OpenCV格式
    48         imagex1 = cv2.cvtColor(numpy.asarray(img_PIL), cv2.COLOR_RGB2BGR)
    49 
    50 
    51         # 向终端打印条形码数据和条形码类型
    52         print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))
    53     cv2.imshow("camera", imagex1)
    54     # 窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
    55     cv2.waitKey(0)
    56 
    57     # 销毁窗口,退出程序
    58     cv2.destroyAllWindows()
    59 
    60 def detect():
    61     cv2.namedWindow("camera",cv2.WINDOW_NORMAL)
    62     frame=cv2.imread("imgx\dongxiao2.png")
    63     decodeDisplay(frame)
    64 
    65 
    66 if __name__ == '__main__':
    67     detect()

    六、实现视频实时读取

     OpenCV-Python视频读取,并帧处理视频,实现条码的动态框选和识别

    识别结果:

    基本代码:

     1 import cv2
     2 import pyzbar.pyzbar as pyzbar
     3 import numpy
     4 from PIL import Image, ImageDraw, ImageFont
     5 
     6 def decodeDisplay(imagex1):
     7     # 转为灰度图像
     8     gray = cv2.cvtColor(imagex1, cv2.COLOR_BGR2GRAY)
     9     barcodes = pyzbar.decode(gray)
    10 
    11     for barcode in barcodes:
    12 
    13         # 提取条形码的边界框的位置
    14         # 画出图像中条形码的边界框
    15         (x, y, w, h) = barcode.rect
    16         cv2.rectangle(imagex1, (x, y), (x + w, y + h), (0, 255, 0), 2)
    17 
    18         # 条形码数据为字节对象,所以如果我们想在输出图像上
    19         # 画出来,就需要先将它转换成字符串
    20         barcodeData = barcode.data.decode("utf-8")
    21         barcodeType = barcode.type
    22 
    23         #不能显示中文
    24         # 绘出图像上条形码的数据和条形码类型
    25         #text = "{} ({})".format(barcodeData, barcodeType)
    26         #cv2.putText(imagex1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,5, (0, 0, 125), 2)
    27 
    28 
    29         #更换为:
    30         img_PIL = Image.fromarray(cv2.cvtColor(imagex1, cv2.COLOR_BGR2RGB))
    31 
    32         # 参数(字体,默认大小)
    33         font = ImageFont.truetype('fontx/hwst.ttf', 35)
    34         # 字体颜色(rgb)
    35         fillColor = (0,255,255)
    36         # 文字输出位置
    37         position = (x, y-10)
    38         # 输出内容
    39         str = barcodeData
    40 
    41         # 需要先把输出的中文字符转换成Unicode编码形式(  str.decode("utf-8)   )
    42 
    43 
    44         draw = ImageDraw.Draw(img_PIL)
    45         draw.text(position, str, font=font, fill=fillColor)
    46         # 使用PIL中的save方法保存图片到本地
    47         # img_PIL.save('02.jpg', 'jpeg')
    48 
    49         # 转换回OpenCV格式
    50         imagex1 = cv2.cvtColor(numpy.asarray(img_PIL), cv2.COLOR_RGB2BGR)
    51 
    52 
    53         # 向终端打印条形码数据和条形码类型
    54         print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))
    55     cv2.imshow("camera", imagex1)
    56 
    57 
    58 def detect():
    59     cv2.namedWindow("camera",cv2.WINDOW_NORMAL)
    60     camera = cv2.VideoCapture(0)
    61 
    62     while True:
    63         # 读取当前帧
    64         ret, frame = camera.read()
    65         #print(ret.shape)
    66         decodeDisplay(frame)
    67 
    68         if(cv2.waitKey(5)==27):
    69             break
    70     camera.release()
    71     cv2.destroyAllWindows()
    72 
    73 
    74 if __name__ == '__main__':
    75     detect()

      


    参考:

    http://www.cnblogs.com/xushengming/p/9872061.html

    https://blog.csdn.net/zx66zx/article/details/82785334

    https://blog.csdn.net/x115104/article/details/78878599

    https://blog.csdn.net/shanzhizi/article/details/50755168

    转载于:https://www.cnblogs.com/dongxiaodong/p/10216579.html

    展开全文
  • 高级二维码扫描仪 支持所有类型QR码条形码 for Android
  • android studio代码,亲自测试,代码绝对可用。
  • 这个资料是条形码二维码扫描识别模块GM65在STM32F103ZET6上示例程序,主要用到的是串口通信和触摸屏显示器。
  • 根据的产品需求,参考扫描仪改版,希望能帮助到生成二维码,扫描二维码,识别图片二维码等需求的猿友。修改幅度,也就没准备针对扫描仪库提交PR。 可定制各式各样的扫描框 可定制全屏扫描或只识别扫描框区域内码 可...
  • 支持的条码二维码包括:EAN/UPC,QR EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, Interleaved 2 of 5 and QR Code 支持图片 jpg bmp png等 vs2013 c++ 条码 二维码识别 通过ZBar和ImageMagick实现 vs ...
  • 安卓条码扫描应用,可扫描二维码,更具zxing代码修改,精简删除了联网搜索功能,反应速度快,识别率很高,可将其作为接口编写自己的扫应用。
  • 二维码扫描器

    2017-09-10 15:34:30
    本文档为德沃二维码扫描器规格书。采用GraphLib影像技术:GraphLib5.0影像技术,具有图像增强,去除噪声、复原、分割、提取等特征,同时体现出德沃对于领先科技、与众不同的解决方案和为协助商业客户解决数据采集...
  • 韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com Android 基于google Zxing实现二维码条形码扫描,仿微信二维码扫描效果

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha  313134555@qq.com

    Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    展开全文
  • Android 基于google Zxing实现二维码 条形码扫描,仿微信二维码扫描效果

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10163203

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心。


    随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然没有微信做的那么精致,但是效果还是可以的,所以将自己修改UI的代码和扫描二维码的代码分享给大家,一是自己以后项目遇到同样的功能直接拷贝来用,二是给还没有加入二维码功能的人一个参考,站在巨人的肩膀上,哈哈,我之前也是站在巨人的肩膀上加上此功能,接下来跟着我一步一步来实现此项功能,里面去除了很多不必要的文件


    我们先看下项目的结构


    • 如果你项目也想加入此功能,你直接将com.mining.app.zxing.camera,com.mining.app.zxing.decoding,com.mining.app.zxing.view这三个包拷贝到你的项目中,然后引入相对应的资源进去,我也是从我的项目中直接引用过来的,包名都没改呢,当然还需要引用Zxing.jar

    • com.example.qr_codescan包里面有一个MipcaActivityCapture,也是直接引入我之前项目的代码的,这个Activity主要处理扫描界面的类,比如,扫描成功有声音和振动等等,主要关注里面的handleDecode(Result result, Bitmap barcode)方法,扫描完成之后将扫描到的结果和二维码的bitmap当初参数传递到handleDecode(Result result, Bitmap barcode)里面,我们只需要在里面写出相对应的处理代码即可,其他的地方都不用改得,我这里处理扫描结果和扫描拍的照片

     /**  * 处理扫描结果  * @param result  * @param barcode  */ public void handleDecode(Result result, Bitmap barcode) {  inactivityTimer.onActivity();  playBeepSoundAndVibrate();  String resultString = result.getText();  if (resultString.equals("")) {   Toast.makeText(MipcaActivityCapture.this, "Scan failed!", Toast.LENGTH_SHORT).show();  }else {   Intent resultIntent = new Intent();   Bundle bundle = new Bundle();   bundle.putString("result", resultString);   bundle.putParcelable("bitmap", barcode);   resultIntent.putExtras(bundle);   this.setResult(RESULT_OK, resultIntent);  }  MipcaActivityCapture.this.finish(); }

    • 我对MipcaActivityCapture界面的布局做了自己的改动,先看下效果图,主要是用到FrameLayout,里面嵌套RelativeLayout,里面的图片也是从微信里面拿出来的,平常我看到需要什么图片就去微信里面找,没有美工的公司的程序员就是苦逼


    布局代码如下

    <?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"        android:layout_height="fill_parent" >    <RelativeLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent" >        <SurfaceView            android:id="@+id/preview_view"            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:layout_gravity="center" />        <com.mining.app.zxing.view.ViewfinderView            android:id="@+id/viewfinder_view"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <include            android:id="@+id/include1"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_alignParentTop="true"            layout="@layout/activity_title" />    </RelativeLayout></FrameLayout>
    在里面我将界面上面部分写在另一个布局里面,然后include进来,因为这个activity_title在我项目里面还供其他的Activity使用,我也是直接拷贝出来的

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:background="@drawable/mmtitle_bg_alpha" >    <Button        android:id="@+id/button_back"        android:layout_width="75.0dip"        android:text="返回"        android:background="@drawable/mm_title_back_btn"        android:textColor="@android:color/white"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_marginLeft="2dip" />    <TextView        android:id="@+id/textview_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignBaseline="@+id/button_back"        android:layout_alignBottom="@+id/button_back"        android:layout_centerHorizontal="true"        android:gravity="center_vertical"        android:text="二维码扫描"        android:textColor="@android:color/white"        android:textSize="18sp" /></RelativeLayout>
    • 在我这个demo里面,有一个主界面MainActivity,里面一个Button, 一个ImageView和一个TextView,点击Button进入到二维码扫描界面,当扫描OK的时候,回到主界面,将扫描的结果显示到TextView,将图片显示到ImageView里面,然后你可以不处理图片,我这里随带的加上图片,主界面的布局很简单如下

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#ffe1e0de" >    <Button        android:id="@+id/button1"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:text="扫描二维码" />    <TextView        android:id="@+id/result"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/button1"        android:lines="2"        android:gravity="center_horizontal"        android:textColor="@android:color/black"        android:textSize="16sp" />    <ImageView        android:id="@+id/qrcode_bitmap"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_alignParentLeft="true"        android:layout_below="@+id/result"/></RelativeLayout>
    • MainActivity里面的代码如下,里面的功能在上面已经说了

    package com.example.qr_codescan;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends Activity private final static int SCANNIN_GREQUEST_CODE = 1/**  * 显示扫描结果  */ private TextView mTextView ; /**  * 显示扫描拍的图片  */ private ImageView mImageView;  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    mTextView = (TextView) findViewById(R.id.result);   mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);    //点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转  //扫描完了之后调到该界面  Button mButton = (Button) findViewById(R.id.button1);  mButton.setOnClickListener(new OnClickListener() {      @Override   public void onClick(View v) {    Intent intent = new Intent();    intent.setClass(MainActivity.this, MipcaActivityCapture.class);    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    startActivityForResult(intent, SCANNIN_GREQUEST_CODE);   }  }); }   @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        switch (requestCode) {  case SCANNIN_GREQUEST_CODE:   if(resultCode == RESULT_OK){    Bundle bundle = data.getExtras();    //显示扫描到的内容    mTextView.setText(bundle.getString("result"));    //显示    mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));   }   break;  }    } }


    • 上面的代码还是比较简单,但是要想做出像微信那样只的扫描框,紧紧上面的代码是没有那种效果的,我们必须重写com.mining.app.zxing.view包下面的ViewfinderView类,微信里面的都是用的图片,我是自己画出来的,代码注释的比较清楚,大家直接看代码吧,相信你能理解的,如果你要修改扫描框的大小,去CameraManager类里面修改

    /* * Copyright (C) 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.mining.app.zxing.view;import java.util.Collection;import java.util.HashSet;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.util.AttributeSet;import android.view.View;import com.example.qr_codescan.R;import com.google.zxing.ResultPoint;import com.mining.app.zxing.camera.CameraManager;/** * This view is overlaid on top of the camera preview. It adds the viewfinder * rectangle and partial transparency outside it, as well as the laser scanner * animation and result points. *  */public final class ViewfinderView extends View private static final String TAG = "log"/**  * 刷新界面的时间  */ private static final long ANIMATION_DELAY = 10Lprivate static final int OPAQUE = 0xFF/**  * 四个绿色边角对应的长度  */ private int ScreenRate;  /**  * 四个绿色边角对应的宽度  */ private static final int CORNER_WIDTH = 10/**  * 扫描框中的中间线的宽度  */ private static final int MIDDLE_LINE_WIDTH = 6;  /**  * 扫描框中的中间线的与扫描框左右的间隙  */ private static final int MIDDLE_LINE_PADDING = 5;  /**  * 中间那条线每次刷新移动的距离  */ private static final int SPEEN_DISTANCE = 5;  /**  * 手机的屏幕密度  */ private static float density; /**  * 字体大小  */ private static final int TEXT_SIZE = 16/**  * 字体距离扫描框下面的距离  */ private static final int TEXT_PADDING_TOP = 30;  /**  * 画笔对象的引用  */ private Paint paint;  /**  * 中间滑动线的最顶端位置  */ private int slideTop;  /**  * 中间滑动线的最底端位置  */ private int slideBottom;  private Bitmap resultBitmap; private final int maskColor; private final int resultColor;  private final int resultPointColor; private Collection<ResultPoint> possibleResultPoints; private Collection<ResultPoint> lastPossibleResultPoints; boolean isFirst;  public ViewfinderView(Context context, AttributeSet attrs) {  super(context, attrs);    density = context.getResources().getDisplayMetrics().density;  //将像素转换成dp  ScreenRate = (int)(20 * density);  paint = new Paint();  Resources resources = getResources();  maskColor = resources.getColor(R.color.viewfinder_mask);  resultColor = resources.getColor(R.color.result_view);  resultPointColor = resources.getColor(R.color.possible_result_points);  possibleResultPoints = new HashSet<ResultPoint>(5); } @Override public void onDraw(Canvas canvas) {  //中间的扫描框,你要修改扫描框的大小,去CameraManager里面修改  Rect frame = CameraManager.get().getFramingRect();  if (frame == null) {   return;  }    //初始化中间线滑动的最上边和最下边  if(!isFirst){   isFirst = true;   slideTop = frame.top;   slideBottom = frame.bottom;  }    //获取屏幕的宽和高  int width = canvas.getWidth();  int height = canvas.getHeight();  paint.setColor(resultBitmap != null ? resultColor : maskColor);    //画出扫描框外面的阴影部分,共四个部分,扫描框的上面到屏幕上面,扫描框的下面到屏幕下面  //扫描框的左边面到屏幕左边,扫描框的右边到屏幕右边  canvas.drawRect(0, 0, width, frame.top, paint);  canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);  canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1,    paint);  canvas.drawRect(0, frame.bottom + 1, width, height, paint);      if (resultBitmap != null) {   // Draw the opaque result bitmap over the scanning rectangle   paint.setAlpha(OPAQUE);   canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);  } else {   //画扫描框边上的角,总共8个部分   paint.setColor(Color.GREEN);   canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,     frame.top + CORNER_WIDTH, paint);   canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top     + ScreenRate, paint);   canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,     frame.top + CORNER_WIDTH, paint);   canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top     + ScreenRate, paint);   canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left     + ScreenRate, frame.bottom, paint);   canvas.drawRect(frame.left, frame.bottom - ScreenRate,     frame.left + CORNER_WIDTH, frame.bottom, paint);   canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH,     frame.right, frame.bottom, paint);   canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate,     frame.right, frame.bottom, paint);      //绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE   slideTop += SPEEN_DISTANCE;   if(slideTop >= frame.bottom){    slideTop = frame.top;   }   canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);         //画扫描框下面的字   paint.setColor(Color.WHITE);   paint.setTextSize(TEXT_SIZE * density);   paint.setAlpha(0x40);   paint.setTypeface(Typeface.create("System", Typeface.BOLD));   canvas.drawText(getResources().getString(R.string.scan_text), frame.left, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint);         Collection<ResultPoint> currentPossible = possibleResultPoints;   Collection<ResultPoint> currentLast = lastPossibleResultPoints;   if (currentPossible.isEmpty()) {    lastPossibleResultPoints = null;   } else {    possibleResultPoints = new HashSet<ResultPoint>(5);    lastPossibleResultPoints = currentPossible;    paint.setAlpha(OPAQUE);    paint.setColor(resultPointColor);    for (ResultPoint point : currentPossible) {     canvas.drawCircle(frame.left + point.getX(), frame.top       + point.getY(), 6.0f, paint);    }   }   if (currentLast != null) {    paint.setAlpha(OPAQUE / 2);    paint.setColor(resultPointColor);    for (ResultPoint point : currentLast) {     canvas.drawCircle(frame.left + point.getX(), frame.top       + point.getY(), 3.0f, paint);    }   }      //只刷新扫描框的内容,其他地方不刷新   postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top,     frame.right, frame.bottom);     } } public void drawViewfinder() {  resultBitmap = null;  invalidate(); } /**  * Draw a bitmap with the result points highlighted instead of the live  * scanning display.  *   * @param barcode  *            An image of the decoded barcode.  */ public void drawResultBitmap(Bitmap barcode) {  resultBitmap = barcode;  invalidate(); } public void addPossibleResultPoint(ResultPoint point) {  possibleResultPoints.add(point); }}

    上面的代码中,中间那根线微信是用的图片,我这里是画的,如果你想更加仿真点就将下面的代码

    canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);

    改成

    Rect lineRect = new Rect();   lineRect.left = frame.left;   lineRect.right = frame.right;   lineRect.top = slideTop;   lineRect.bottom = slideTop + 18;   canvas.drawBitmap(((BitmapDrawable)(getResources().getDrawable(R.drawable.qrcode_scan_line))).getBitmap(), null, lineRect, paint);

    那条扫描线自己去微信里面找一下,我贴出来的失真了,下载微信apk,将后缀名改成zip,然后解压就行了

    画扫描框下面字体的代码需要修改下,这样子能根据字体自动排列在中间,如果字太长我没有处理,那个要自动换行,你可以自行处理

    paint.setColor(Color.WHITE);  paint.setTextSize(TEXT_SIZE * density);  paint.setAlpha(0x40);  paint.setTypeface(Typeface.DEFAULT_BOLD); String text = getResources().getString(R.string.R.string.scan_text);float textWidth = paint.measureText(text);canvas.drawText(text, (width - textWidth)/2, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint)

    运行界面截图,其中中间的那根绿色的线会上下移动,跟微信的效果差不多,当然运行你还需要相对应的权限问题,有兴趣的朋友可以去下载demo



    从8点多写这篇博客写到现在,看起来这么点字,但实际上还是比较耗时间的,如果你觉得这篇文章对你有帮助,你就顶一下,哈哈,洗澡睡觉去了,上面的项目中还有一些资源文件我没有贴出来,想要看效果可以下载源码


    我在Android 基于google Zxing实现对手机中的二维码进行扫描这篇文章中实现了对手机中二维码照片的扫描,并且替换了中间的扫描线,和微信效果更加相似,建议大家去下那文章的项目源码


    项目源码,点击下载




               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block var foo = 'bar'; 

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目Value
    电脑$1600
    手机$12
    导管$1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列第二列第三列
    第一列文本居中第二列文本居右第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPEASCIIHTML
    Single backticks'Isn't this fun?'‘Isn’t this fun?’
    Quotes"Isn't this fun?"“Isn’t this fun?”
    Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to- HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

    Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    gantt
            dateFormat  YYYY-MM-DD
            title Adding GANTT diagram functionality to mermaid
            section 现有任务
            已完成               :done,    des1, 2014-01-06,2014-01-08
            进行中               :active,  des2, 2014-01-09, 3d
            计划一               :         des3, after des2, 5d
            计划二               :         des4, after des3, 5d
    
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 基恩士条形码二维码扫描设备软件,适用于手持式、固定式各个系列的扫码设备
  • 二维码/条形码生成,以及二维码/条形码扫描Demo Demo功能全面,简单明了
  • android studio 集成zxing二维码条形码扫描android studio 集成zxing 扫描器 扫描框、扫描线定制样式直接上代码。代码说明:一、添加权限 <uses-permission android:name="android

    android studio 集成zxing二维码,条形码扫描

    android studio 集成zxing 扫描器 扫描框、扫描线定制样式

    直接上代码。代码说明:

    一、添加权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

    二、配置app build.gradle

      compile 'com.google.zxing:core:3.2.1'
      compile 'com.journeyapps:zxing-android-embedded:3.5.0'

    三、Activity使用

    (1)Activity代码

    public class SecondActivity extends AppCompatActivity {
        CompoundBarcodeView mBarcodeView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            mBarcodeView = (CompoundBarcodeView) findViewById(R.id.dbv_custom);
    
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
    
    
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA},
                        1);
            } else {
                // Choose only one!!!这一个是扫描结果只会出来一次
                mBarcodeView.decodeSingle(callback);
                // Or这一是扫描结果一直会打印出来
                //mBarcodeView.decodeContinuous(callback);
    
            }
    
        }
    
        private BarcodeCallback callback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                // Do something with the scanned QR code.
                // result.getText() returns decoded QR code.
                //mBarcodeView.
                System.out.println("______________________________"+result.getText());
               /* if(!TextUtils.isEmpty(result.getText())){
                    mBarcodeView.decodeContinuous(null);
                }*/
            }
    
            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {
            }
        };
    
        @Override
        protected void onPause() {
            super.onPause();
            mBarcodeView.pause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mBarcodeView.resume();
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == 1) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Choose only one!!!
                    mBarcodeView.decodeSingle(callback);
                    // Or
                    //mBarcodeView.decodeContinuous(callback);
                    return;
                }
            }
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    

    (2)activity布局文件代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  android:gravity="center"
        >
    
        <com.journeyapps.barcodescanner.CompoundBarcodeView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/dbv_custom"
            app:zxing_scanner_layout="@layout/code_scanning_scanner"
            >
        </com.journeyapps.barcodescanner.CompoundBarcodeView>
    
    
    </LinearLayout>
    

    其中重点是 app:zxing_scanner_layout=”@layout/code_scanning_scanner”

    code_scanning_scanner控制扫描页面的样式,下面重点解析。


    (3)code_scanning_scanner代码

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <com.journeyapps.barcodescanner.BarcodeView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/zxing_barcode_surface"
            app:zxing_framing_rect_width="250dp"
            app:zxing_framing_rect_height="250dp"
            app:qrcv_animTime="1000"
            app:qrcv_borderColor="#00000000"
            app:qrcv_borderSize="1dp"
            app:qrcv_cornerColor="#ffffff"
            app:qrcv_cornerLength="20dp"
            app:qrcv_cornerSize="3dp"
            app:qrcv_maskColor="#33FFFFFF"
            app:qrcv_rectWidth="220dp"
            app:qrcv_scanLineColor="#ffffff"
            app:qrcv_scanLineSize="1dp"
            app:qrcv_topOffset="100dp"
            />
    
        <com.ljm.zxing.ScanView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/zxing_viewfinder_view"
            app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
            app:zxing_result_view="@color/zxing_custom_result_view"
            app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
            app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>
    
        <TextView
            android:id="@+id/zxing_status_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:background="@color/zxing_transparent"
            android:text="@string/zxing_msg_default_status"
            android:textColor="@color/zxing_status_text"/>
    
    </merge>

    com.ljm.zxing.ScanView是自定义控件,控制扫描框,扫描线等样式
    (4)ScanView代码

    package com.ljm.zxing;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.util.AttributeSet;
    import com.journeyapps.barcodescanner.CameraPreview;
    import com.journeyapps.barcodescanner.ViewfinderView;
    
    /**
     * Created by BettyLi on 2018/3/22.
     * 重写ViewfinderView设置扫描框的样式,四个角和扫描线样式
     */
    
    public class ScanView extends ViewfinderView  {
    
        protected static final int CURRENT_POINT_OPACITY = 0xA0;
        protected Bitmap resultBitmap;
        protected final Paint paint;
        protected CameraPreview cameraPreview;
        protected Rect framingRect;
        protected Rect previewFramingRect;
        private int i=0;
        private int ScreenRate;
    
        /**
         * 四个绿色边角对应的宽度
         */
        private static final int CORNER_WIDTH = 10;
        /**
         * 手机的屏幕密度
         */
        private static float density;
    
    
    
        public ScanView(Context context, AttributeSet attrs) {
            super(context, attrs);
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            //四个绿色边角
            density = context.getResources().getDisplayMetrics().density;
            //将像素转换成dp
            ScreenRate = (int)(20 * density);
        }
    
        public void setCameraPreview(CameraPreview view) {
            this.cameraPreview = view;
            view.addStateListener(new CameraPreview.StateListener() {
                @Override
                public void previewSized() {
                    refreshSizes();
                    invalidate();
                }
    
                @Override
                public void previewStarted() {
    
                }
    
                @Override
                public void previewStopped() {
    
                }
    
                @Override
                public void cameraError(Exception error) {
    
                }
    
                @Override
                public void cameraClosed() {
    
                }
            });
        }
    
        protected void refreshSizes() {
            if(cameraPreview == null) {
                return;
            }
            Rect framingRect = cameraPreview.getFramingRect();
            Rect previewFramingRect = cameraPreview.getPreviewFramingRect();
            if(framingRect != null && previewFramingRect != null) {
                this.framingRect = framingRect;
                this.previewFramingRect = previewFramingRect;
            }
        }
    
        @SuppressLint("DrawAllocation")
        @Override
        public void onDraw(Canvas canvas) {
            refreshSizes();
            if (framingRect == null || previewFramingRect == null) {
                return;
            }
            Rect frame = framingRect;
            int width = canvas.getWidth();
            int height = canvas.getHeight();
            paint.setColor(resultBitmap != null ? resultColor : maskColor);
            canvas.drawRect(0, 0, width, frame.top, paint);
            canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
            canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
            canvas.drawRect(0, frame.bottom + 1, width, height, paint);
            if (resultBitmap != null) {
                paint.setAlpha(CURRENT_POINT_OPACITY);
                canvas.drawBitmap(resultBitmap, null, frame, paint);
            }else{
                drawFrameCorner(canvas, frame);
                drawLaserLine(canvas, frame);//绘制扫描线
            }
    
        }
    
        /**
         * 画扫描线
         *
         * @param canvas
         * @param frame
         */
        private void drawLaserLine(Canvas canvas, Rect frame) {
    
    
            if ((i += 5) < frame.bottom - frame.top) {
    
            } else {
                i = 0;
            }
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.GREEN);// 设置扫描线颜色
            canvas.drawRect(frame.left - 1, frame.top + i - 1, frame.right + 1,frame.top + 1 + i, paint);
            // 刷新
            invalidate();
        }
    
        /**
         * 绘制扫描框4角
         *
         * @param canvas
         * @param frame
         */
        private void drawFrameCorner(Canvas canvas, Rect frame) {
    
            //画扫描框边上的角,总共8个部分
            paint.setColor(Color.GREEN);
            canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,
                    frame.top + CORNER_WIDTH, paint);
            canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top
                    + ScreenRate, paint);
            canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,
                    frame.top + CORNER_WIDTH, paint);
            canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top
                    + ScreenRate, paint);
            canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left
                    + ScreenRate, frame.bottom, paint);
            canvas.drawRect(frame.left, frame.bottom - ScreenRate,
                    frame.left + CORNER_WIDTH, frame.bottom, paint);
            canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH,
                    frame.right, frame.bottom, paint);
            canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate,
                    frame.right, frame.bottom, paint);
    
        }
        public void drawViewfinder() {
            Bitmap resultBitmap = this.resultBitmap;
            this.resultBitmap = null;
            if (resultBitmap != null) {
                resultBitmap.recycle();
            }
            invalidate();
        }
        public void drawResultBitmap(Bitmap result) {
            resultBitmap = result;
            invalidate();
        }
    }
    

    源码地址https://download.csdn.net/download/qq_24349695/10302772

    展开全文
  • Android QR Code 二维条形码扫描仪

    热门讨论 2012-08-29 11:18:45
    这个范例需要引用sourceforge.jp里的qrcode项目...请在下载.jar文件之后,将文件名修改为Source ForgeQRCode.jar,并导入到开发项目中。 分享参考自Android SDK开发范例大全第3版。
  • 记录学习手机二维码扫描实现原理及代码实现,单纯个人记录,但也希望能够对共同学习的人有些帮助 ,还有下载积分不是我控制的 CSDN自动设置了
  • 代码是条码二维码扫描实例,根据google官方写的条码扫描器简化的,代码文件完善,测试扫描速度快,结果正确率高,适合需要做条形码扫描的人参考使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,454
精华内容 1,781
关键字:

二维码条码扫描器