精华内容
下载资源
问答
  • 二维码

    千次阅读 2016-02-18 08:38:11
    二微码的三个角是用来确定二维码的方向的 。 有黑的白的,表示0和1, 只要用到编码和解码就行了。 ZXing 条码和二维码的扫描的功能。 1:摄像头,需要用到自定义的摄像头。内部的预览的接口, 2: ...
    草料二微码生成器
    二微码的三个角是用来确定二维码的方向的 。
    有黑的白的,表示0和1,


    只要用到编码和解码就行了。


    ZXing 条码和二维码的扫描的功能。


    1:摄像头,需要用到自定义的摄像头。内部的预览的接口,
    2:


    新建一个新的activity:


    ZXing 现在在GitHub里面也有
    https://github/zxing/zxing
    支持的非常好。
    需要通过gradle来下载jar包。
    在Android studio 里面导包
    f4,dependecy
    搜索zxing得到
    com.google.zxing:zxing:core:3.2.1
    com.google.zxing:android-core:3.2.1
    同步之后
    现在还不能用。


    现在需要专门的代码:
    ++++++++++++++++++++++++++++
    怎么将一个代码导入进去
    File->New->Import Module
    +++++++++++++++++++++++++++++


    ZXing android 里面的清单文件。
    有一个CaptureActivity
    <Intent-Filter>


    <


    在原本的布局里面添加一个按钮“点击扫描二维码”


    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    startActivityForResult(intent,998);


    ZXing android 界面内部也导入了那个。jar包了。


    -----------------------------
    下面的两句话,可以做也可以不做
    修改我们自己的 删除哪两个包。
    compile project(':ZXingAndroid');
    这一步 也可以在f4 dependency 里面添加的时候选择model就性了
    -----------------------------------
    二维码:
    1:需要导入ZXing Android 版本,
    2:设置类库的依赖,例如app 依赖ZXingAndroid 模块;
    3:通过ZXingAndroid 提供的隐式意图,就可扫描的,注意这个版本必须要用这个饮食意图。
    com.google.zxing.client.android.SCAN
    4:startActivityForResult
    这个时候它的二维码的扫描是长方形的。
    Intents 类可以直接使用,来设置ACTION,和其余的参数;
    例如,扫描时候的取景框的宽高,都可以设置。


    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    //Intents.Scan.ACTION,其实就是com.google.zxing.client.android.SCAN
    //Intents.Scan.WIDTH也可以设置
    Intent.putExtra(Intents.Scan.WIDTH,600);
    Intent.putExtra(Intents.Scan.HEIGHT,600);
    startActivityForResult(intent,998);
    扫描的时候特别慢,因为要扫描各种格式,
    Intents.SCAN.MODE 默认情况下检测所有的二维码的信息。
    如果想要只指定一种呢?
    PRODUCT_MODE->条形码
    QR_CODE_MODE->QR码。


    还有一个FORMATS 这个是
    支付宝是QR_CODE/onede CODE


    Intent.putExtra(Intents.Scan.MODE,Intents.SCAN.QR_CODE_MODE);;




    5: 获取结果,通过onActivityResult来获取,内容都在Intent中
    返回的结果都在Intent 中。




    onActivityResult(int requestCode,int resultCode,Intent data){
    if(requestCode=998){
    if(resultCode==RESULT_OK){
    String stringExtra = data.getStringExtra(Intents.Scan.RESULT);//如果是字符串就是RESULT,如果是字节就是RESULT_BYTES
    Log.d("BarCodeActivity","barcode"+stringExtra);
    }


    }
    }
    这个时候自己生成一个带字符的二维码就行了。




    +++++++++++++++++++++++
    如何生成二维码呢?
    添加一个button 点击生成二维码
    最终的是一个图片Bitmap,
    生成的步骤:
    1:准备数据
    2:生成的格式,二维码,
    3:通过编码生成1,0结构,也称为0,1矩阵
    4:通过矩阵,生成Bitmap


    需要找com.google.zxing.MutiFormatWriter这个类


    MultiFormatWriter writer = new MultiFormatWriter();
    //QR_CODE 是国内最常用的。生成一个0,1的矩阵,这个矩阵实际上就是二维码的黑白位置的标注
    BitMatrix bitMatrix = writer.encode(“Hello World”,BarcodeFormat.QR_CODE,128,128);
    需要我们单独的画出来。


    这个矩阵是
    0,0,1,0,1,1,1,1,1------1 width个数子
    0,0,1,0,1,1,1,1,1------1
    0,0,1,0,1,1,1,1,1------1
    0,0,1,0,1,1,1,1,1------1
    |
    0,0,1,0,1,1,1,1,1------1
    Height 行


    需要手动生成Bitmap,按照0,1 进行绘制;


    //生成Bitmap,进行绘制
    //创建空的,可以绘制的bitmap
    Bitmap bitmap =Bitmap.createBitmap(128,128,Bitmap。Config.ARGB_8888);
    //创建bitmap的画布,用于绘制Bitmap,它可以直接这样绘制了,因为上面的bitmap 是空的
    //可以不使用canvas,直接使用setPixel。Canvas canvas = new Canvas(bitmap);




    int width = bitMatrix.getWidth();
    int height = bitMatrix.getHeight();




    for(int i=0;i<height;i++){
    for(int j =0;j<width;j++){
    boolean b =bitMatrix.get(j,i);
    if(b){
    //1 true 代表需要的是黑色
    bitmap.setPixel(j,i,Color.BLACK);
    }else{
    //0 false 代表需要绘制白色
    bitmap.setPixel(j,i,Color.WHITE);
    }
    }


    }


    再设置一个ImageView 用来显示。
    id ->image_code


    mImageView.setImageBitmap(bitmap);


    ----------------------------------------
    ----------------------------------------
    当然 也可以有简单的方法:
    使用Intent 生成二维码
    //使用Intent 来生成二维码
    Intent intent = new Intent(Intents.Encode.ACTION);
    intent.putExtra(Intents.Encode.FORMAT,BarCodeFormat.QR_CODE.name());//如果Intents.Encode.FORMAT没有指定,默认的是QR码
    //一定要注意上面传的是编码的name,一定要有这个name
    intent.putExtra(Intents.Encode.DATA,"Hello World");
    intent.putExtra(Intents.Encode.TYPE,Contents.Type.TEXT);//如果是QR码类型必须要指定。
    startActivity(intent);


    --------------------------------------------
    ---------------------------------------------
    如果想要在二维码中间放一个图片呢?


    明天支付:
    第三方登录,分享 OAuth,




    推送
    统计分析
    加密
    展开全文
  • 同时很多只是很平凡的二维码,请拿起你的 把这个二维码 设计起来吧。下面分享了几个非常好的二维码设计。  二维码原理: 二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。 堆叠式/行排式二维...

    随着网络的迅速发展 发展 发展,二维码的应用将会越来越多。同时很多只是很平凡的二维码,请拿起你的手 把这个二维码 设计起来吧。下面分享了几个非常好的二维码设计。

     二维码原理:

    二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。 堆叠式/行排式二维条码形态上是由多行短截的一维5条码堆叠而成;矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,“点”和“空”的排列组成代码。

    最近对二维码产生了兴趣 研究了一下二维码 这里生出的术语 qrcode  容错性较高。

    数据表示方法

    深色模块表示二进制“1”,浅色模块表示二进制“0”。

    纠错能力

    · L级:约可纠错7%的数据码字

    · M级:约可纠错15%的数据码字

    · Q级:约可纠错25%的数据码字

    · H级:约可纠错30%的数据码字

    上面的设计 就很完美的利用了 qrcode的容错性,非常nice  也非常有创意!!

    1.google 接口

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?php

                   $urlToEncode="http://www.csd2n.net";//要生成二维码的网址

                   generateQRfromGoogle($urlToEncode);

                   function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0')

                   {

                   $url = urlencode($url);

                   echo '<img src="http://chart.apis.google.com/chart?chs='.$widhtHeight.'x'.$widhtHeight.'&cht=qr&chld='.$EC_level.'|'.$margin.'&chl='.$chl.'" alt="QR code" widhtHeight="'.$size.'" widhtHeight="'.$size.'"/>';//Google API接口,若失效可到Google网址查询最新接口

                   }

                   ?>

      

    2..js代码 转换为 canvas (重点)

    demo: http://hxend.com/jsqrcode/test/

    1

    2

    3

    4

    5

    6

    7

    <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/142/gjxgxu0g/qrgen.min.js"></script>

                   <div id=qrcode></div>

                   <script type="text/javascript">

                   qrcode(document.getElementById('qrcode'),{

                       data:'http://geraldl.net'

                   });

                   </script>

      

    3. 图片接口

    1

    <img src="http://qrcoder.sinaapp.com?t=hello world">

      

    4.demo 里面http://hxend.com/jsqrcode/test/ 代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    <!doctype html>

    <html>

        <head>

            <title>QRCode</title>

            <script type="text/javascript" src="http://files.cnblogs.com/webers/qrcode-light.js"></script>

            <script type="text/javascript" src="http://files.cnblogs.com/webers/qrgen.js"></script>

        </head>

        <body>

            <div>

                <h1>二维码生成</h1>

                <div>

                    图片: <img id=qrimg src=http://hdimg.qiniudn.com/Uploads/141889425189.png>

                    <label><input id=qrclearedges type=checkbox checked>清理边缘</label>

                </div>

                <div><input id=fimg type=file></div>

                <div>文本: <textarea id=qrtext>http://www.btgoogle.com</textarea></div>

                <div>大小: <input id=cellSize type=range min=2 max=10 value=6></div>

                <table>

                    <tr>

                        <td rowspan=2>效果:</td>

                        <td colspan=3><input id=cellEffect type=range min=-50 max=50 step=5 value=0></td>

                    </tr>

                    <tr id=cellEffectStops>

                        <td align=left><a href=# data=l>液体</a></td>

                        <td align=center><a href=# data=s>方块</a></td>

                        <td align=right><a href=# data=r>圆</a></td>

                    </tr>

                </table>

                <div>

                    Foreground color: <input id=colorFore type=color value=#4169e1>

                    Background color: <input id=colorBack type=color value=#ffffff><br>

                    Outside-border color: <input id=colorOut type=color value=#cd5c5c>

                    Inside-border color: <input id=colorIn type=color value=#191970>

                </div>

                <button id=qrgen>生成</button>

            </div>

            <div id=qrcode></div>

            <script src="http://files.cnblogs.com/webers/take.js"></script>

        </body>

    </html>

    展开全文
  • AVCaptureDevice //初始化捕捉设备 AVCaptureDeviceInput //创建输入流 input AVCaptureSession //创建...AVCaptureMetadataOutput //输出 二维码 AVCaptureVideoDataOutput //输出 视频流(随着屏幕刷新返回一...

    AVCaptureDevice //初始化捕捉设备

    AVCaptureDeviceInput //创建输入流 input

    AVCaptureSession //创建会话

    AVCaptureVideoPreviewLayer //预览图层

    AVCaptureMetadataOutput //输出 二维码

    AVCaptureVideoDataOutput //输出 视频流(随着屏幕刷新返回一个图片很快相当于视频)

    session 关联设备、输入、输出、预览

    效果图

    直接上项目地址吧:现在csdn积分无法控制,直接把代码复制,可以直接复制走或者github下载即可

    csdn:https://download.csdn.net/download/wangxiaoertedaye/11069772

    gitHub:https://github.com/zxgiOS/erweima
    代码:图片只能上下载代码库里有,或让美工制作

    //
    //  ScanCodeViewController.m
    //  Productproject
    //
    //  Created by apple on 17/10/26.
    //  Copyright © 2017年. All rights reserved.
    //
    
    #import "ScanCodeViewController.h"
    
    #define kDeviceVersion [[UIDevice currentDevice].systemVersion floatValue]
    
    #define kScreenWidth  [UIScreen mainScreen].bounds.size.width
    #define kScreenHeight [UIScreen mainScreen].bounds.size.height
    #define kNavbarHeight ((kDeviceVersion>=7.0)? 64 :44 )
    
    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    
    #define kSCREEN_MAX_LENGTH (MAX(kScreenWidth, kScreenHeight))
    #define kSCREEN_MIN_LENGTH (MIN(kScreenWidth, kScreenHeight))
    
    #define IS_IPHONE4 (IS_IPHONE && kSCREEN_MAX_LENGTH < 568.0)
    #define IS_IPHONE5 (IS_IPHONE && kSCREEN_MAX_LENGTH == 568.0)
    #define IS_IPHONE6 (IS_IPHONE && kSCREEN_MAX_LENGTH == 667.0)
    #define IS_IPHONE6P (IS_IPHONE && kSCREEN_MAX_LENGTH == 736.0)
    
    @import AVFoundation;
    
    @interface ScanCodeViewController ()<AVCaptureMetadataOutputObjectsDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>{
        UILabel * introLab;
        BOOL isLightOn;
        UIButton *mineQRCode;
        UIButton *theLightBtn;
        BOOL hasTheVC;
        BOOL isFirst;
        BOOL upOrdown;
        int num;
        AVCaptureVideoPreviewLayer *preView;
        AVCaptureDevice *captureDevice;
        NSTimer * timer;
        
    }
    
    @property (nonatomic,strong) AVCaptureSession *session;
    @property (nonatomic,weak) AVCaptureMetadataOutput *output;
    @property (nonatomic,retain) UIImageView *lineIV;
    
    @end
    
    @implementation ScanCodeViewController
    
    -(void)initUI{
        isFirst=YES;
        upOrdown = NO;
        num =0;
    }
    - (void)startSessionRightNow:(NSNotification*)notification {
        [self creatTimer];
        [_session startRunning];
    }
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        if(isFirst)
        {
            [self creatTimer];
            [_session startRunning];
        }
        isFirst=NO;
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [self deleteTimer];
        [[NSNotificationCenter defaultCenter]removeObserver:self name:@"startSession" object:nil];
    }
    
    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
    }
    #pragma mark - 删除timer
    - (void)deleteTimer
    {
        if (timer) {
            [timer invalidate];
            timer=nil;
        }
    }
    #pragma mark - 创建timer
    - (void)creatTimer
    {
        if (!timer) {
            timer=[NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(animation) userInfo:nil repeats:YES];
        }
    }
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(startSessionRightNow:) name:@"startSession" object:nil];
        if (!isFirst) {
            [self creatTimer];
            [_session startRunning];
        }
    }
    - (void)viewDidLoad {
        self.navigationItem.title = @"扫一扫";
        
        self.view.backgroundColor = [UIColor colorWithWhite:0.2 alpha:1];
        [super viewDidLoad];
        
        [self initUI];
        [self setupDevice];
    }
    -(void)setupDevice{
        //1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo
        captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        
        NSError *error;
        //2.用captureDevice创建输入流input
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
        if (!input) {
            NSLog(@"%@", [error localizedDescription]);
            return ;
        }
        
        //创建会话
        _session = [[AVCaptureSession alloc] init];
        [_session setSessionPreset:AVCaptureSessionPresetHigh];
        
        if ([_session canAddInput:input]) {
            [_session addInput:input];
        }
        
        //预览视图
        preView = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_session];
        //设置预览图层填充方式
        [preView setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        [preView setFrame:self.view.layer.bounds];
        
        [self.view.layer addSublayer:preView];
        
        
        //输出
        AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        if ([_session canAddOutput:output]) {
            [_session addOutput:output];
        }
        self.output = output;
        //设置扫描范围
        output.rectOfInterest = CGRectMake(0.25,(kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2/self.view.layer.bounds.size.width,  self.view.layer.bounds.size.width * 0.7/self.view.layer.bounds.size.height,(self.view.layer.bounds.size.width * 0.7)/self.view.layer.bounds.size.width);
        
        NSArray *arrTypes = output.availableMetadataObjectTypes;
        NSLog(@"%@",arrTypes);
        
        if ([_output.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode] || [_output.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeCode128Code]) {
            _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
            // [_session startRunning];
        } else {
            [_session stopRunning];
            //        rightButton.enabled = NO;
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"抱歉!" message:@"相机权限被拒绝,请前往设置-隐私-相机启用此应用的相机权限。" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
            [alert show];
            return;
        }
        UIView *drawView = [[UIView alloc]initWithFrame:self.view.bounds];
        drawView.backgroundColor = [UIColor blackColor];
        drawView.alpha = 0.5;
        [self.view addSubview:drawView];
        //选定一块区域,设置不同的透明度
        UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0,  self.view.bounds.size.width,  self.view.bounds.size.height)];
        [path appendPath:[[UIBezierPath bezierPathWithRoundedRect:CGRectMake((kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2, self.view.layer.bounds.size.height * 0.25, self.view.layer.bounds.size.width * 0.7,self.view.layer.bounds.size.width * 0.7) cornerRadius:0] bezierPathByReversingPath]];
        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        shapeLayer.path = path.CGPath;
        [drawView.layer setMask:shapeLayer];
        UIImageView *codeFrame = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2, self.view.layer.bounds.size.height * 0.25,  self.view.layer.bounds.size.width * 0.7, self.view.layer.bounds.size.width * 0.7)];
        codeFrame.contentMode = UIViewContentModeScaleAspectFit;
        //NSString *name = [@"Resource.bundle" stringByAppendingPathComponent:@"codeframe"];
        
        [codeFrame setImage:[UIImage imageNamed:@"codeframe"]];
        [self.view addSubview:codeFrame];
        
        introLab = [[UILabel alloc] initWithFrame:CGRectMake(preView.frame.origin.x, preView.frame.origin.y + preView.frame.size.height, preView.frame.size.width, 40)];
        introLab.numberOfLines = 1;
        introLab.textAlignment = NSTextAlignmentCenter;
        introLab.textColor = [UIColor whiteColor];
        introLab.adjustsFontSizeToFitWidth = YES;
        introLab.text = @"将二维码/条码放入框内,即可自动扫描";
        [self.view addSubview:introLab];
        
        //我的二维码按钮
        mineQRCode = [UIButton buttonWithType:UIButtonTypeCustom];
        mineQRCode.frame = CGRectMake(self.view.frame.size.width / 2 - 100 / 2, introLab.frame.origin.y+introLab.frame.size.height - 5, 100, introLab.frame.size.height);
        [mineQRCode setTitle:@"我的二维码" forState:UIControlStateNormal];
        [mineQRCode setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [mineQRCode addTarget:self action:@selector(showTheQRCodeOfMine:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:mineQRCode];
        mineQRCode.hidden = YES;
        
        //theLightBtn
        theLightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        theLightBtn.frame = CGRectMake(self.view.frame.size.width / 2 - 100 / 2, mineQRCode.frame.origin.y + mineQRCode.frame.size.height + 20, 100, introLab.frame.size.height);
        
        [theLightBtn setImage:[UIImage imageNamed:@"light"] forState:UIControlStateNormal];
        [theLightBtn setImage:[UIImage imageNamed:@"lighton"] forState:UIControlStateSelected];
        [theLightBtn addTarget:self action:@selector(lightOnOrOff:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:theLightBtn];
        
        if (![captureDevice isTorchAvailable]) {
            theLightBtn.hidden = YES;
        }
        // Start
        _lineIV = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2,self.view.layer.bounds.size.height * 0.25 , self.view.layer.bounds.size.width * 0.7, 5)];
        //NSString *lineName = [@"Resource.bundle" stringByAppendingPathComponent:@"line"];
        
        _lineIV.image = [UIImage imageNamed:@"line"];
        [self.view addSubview:_lineIV];
        
        
        //开始扫描
        [_session startRunning];
    }
    //手电筒?的开和关
    - (void)lightOnOrOff:(UIButton *)sender {
        sender.selected = !sender.selected;
        isLightOn = 1 - isLightOn;
        if (isLightOn) {
            [self turnOnLed:YES];
        }
        else {
            [self turnOffLed:YES];
        }
    }
    
    //打开手电筒
    - (void) turnOnLed:(bool)update {
        [captureDevice lockForConfiguration:nil];
        [captureDevice setTorchMode:AVCaptureTorchModeOn];
        [captureDevice unlockForConfiguration];
    }
    //关闭手电筒
    - (void) turnOffLed:(bool)update {
        [captureDevice lockForConfiguration:nil];
        [captureDevice setTorchMode: AVCaptureTorchModeOff];
        [captureDevice unlockForConfiguration];
    }
    - (void)showTheQRCodeOfMine:(UIButton *)sender {
        NSLog(@"showTheQRCodeOfMine");
    }
    - (void)animation {
        
        if (upOrdown == NO) {
            num ++;
            _lineIV.frame = CGRectMake((kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2,self.view.layer.bounds.size.height * 0.25+ 2 * num, self.view.layer.bounds.size.width * 0.7, 5);
            if (IS_IPHONE5||IS_IPHONE4) {
                NSLog(@"%f",(int)self.view.frame.size.width*.7);
                if (2 * num == (int)(self.view.layer.bounds.size.width *.7)) {
                    upOrdown = YES;
                }else if (2 * num == (int)(self.view.layer.bounds.size.width *.7)-1){
                    
                    upOrdown = YES;
                    
                }
            }
            else {
                
                NSLog(@"%f",(int)self.view.frame.size.width*.7-3);
                NSLog(@"%d",2 * num);
                if (2 * num == (int)(self.view.frame.size.width*.7)) {
                    upOrdown = YES;
                }if (2 * num == (int)(self.view.layer.bounds.size.width *.7)-1){
                    
                    upOrdown = YES;
                    
                }
                
            }
        }
        else {
            num --;
            _lineIV.frame = CGRectMake((kScreenWidth - self.view.layer.bounds.size.width * 0.7)/2, self.view.layer.bounds.size.height * 0.25 + 2 * num, self.view.layer.bounds.size.width * 0.7, 5);
            
            if (num == 0) {
                upOrdown = NO;
            }
        }
    }
    
    #pragma mark - AVCaptureMetadataOutputObjectsDelegate
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        //判断是否有数据
        if (metadataObjects != nil && [metadataObjects count] > 0) {
            
            AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
            //判断回传的数据类型
            if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
                
                NSLog(@"stringValue = %@",metadataObj.stringValue);
                [self checkQRcode:metadataObj.stringValue];
            }
        }
        [_session stopRunning];
        [self performSelector:@selector(startReading) withObject:nil afterDelay:0.5];
    }
    
    -(void)startReading{
        [_session startRunning];
    }
    -(void)stopReading{
        [_session stopRunning];
    }
    /**
     * 判断二维码
     */
    - (void)checkQRcode:(NSString *)str{
        
        if (str.length == 0) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"找不到二维码" message:@"导入的图片里并没有找到二维码" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
            [alert show];
            return;
        }
        
        if ([str hasPrefix:@"http"]) {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
        }else{
            
            [_session stopRunning];
            
            [self KeepoutView:str];
            //弹出一个view显示二维码内容
            NSLog(@"%@",str);
        }
        
    }
    /**
     * 将二维码图片转化为字符
     */
    - (NSString *)stringFromFileImage:(UIImage *)img{
        int exifOrientation;
        switch (img.imageOrientation) {
            case UIImageOrientationUp:
                exifOrientation = 1;
                break;
            case UIImageOrientationDown:
                exifOrientation = 3;
                break;
            case UIImageOrientationLeft:
                exifOrientation = 8;
                break;
            case UIImageOrientationRight:
                exifOrientation = 6;
                break;
            case UIImageOrientationUpMirrored:
                exifOrientation = 2;
                break;
            case UIImageOrientationDownMirrored:
                exifOrientation = 4;
                break;
            case UIImageOrientationLeftMirrored:
                exifOrientation = 5;
                break;
            case UIImageOrientationRightMirrored:
                exifOrientation = 7;
                break;
            default:
                break;
        }
        
        NSDictionary *detectorOptions = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; // TODO: read doc for more tuneups
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:detectorOptions];
        
        NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:img.CGImage]];
        
        CIQRCodeFeature * qrStr  = (CIQRCodeFeature *)features.firstObject;
        //只返回第一个扫描到的二维码
        return qrStr.messageString;
    }
    
    - (void)KeepoutView:(NSString*)orcodeStr{
        //做扫描成功之后的逻辑处理
        UIView *outView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
        outView.backgroundColor = [UIColor whiteColor];
        UIWindow *wind = [UIApplication sharedApplication].keyWindow;
        [self.view addSubview:outView];
        
    }
    
    -(void)dealloc{
        NSLog(@"%@ dealloc",NSStringFromClass(self.class));
    }
    
    
    @end
    

     

    展开全文
  • 扫描二维码

    2017-12-06 14:53:59
    一、二维码的介绍 ios7.0开始,系统开始支持二维码扫描功能 二维码实现思路: 1、输入设备:用来获取外界信息(摄像头、麦克风、键盘) 2、输出设备:将收集到的信息,做解析,获取内容 3、会话session:连接...

    一、二维码的介绍

    ios7.0开始,系统开始支持二维码扫描功能

    二维码实现思路:
    1、输入设备:用来获取外界信息(摄像头、麦克风、键盘)
    2、输出设备:将收集到的信息,做解析,获取内容
    3、会话session:连接输入和输出设备
    4、特殊的layer:展示输入设备,所采集的信息


    二、基本实现

    #import <AVFoundation/AVFoundation.h>
    
    @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
    
    // 输入设备
    @property (nonatomic, strong)AVCaptureDeviceInput *input;
    
    // 输出设备
    @property (nonatomic, strong)AVCaptureMetadataOutput *output;
    
    // 特殊会话
    @property (nonatomic, strong)AVCaptureSession *session;
    
    // 特殊layer
    @property (nonatomic, strong)AVCaptureVideoPreviewLayer *previewLayer;
    
    @end
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
        //1、创建输入设备
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
        self.input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    
        //2、创建输出设备
        self.output = [[AVCaptureMetadataOutput alloc] init];
    
        //3、创建会话session
        self.session = [[AVCaptureSession alloc] init];
    
        //会话扫描展示的大小
        [self.session setSessionPreset:AVCaptureSessionPresetHigh];
    
        //会话跟输入设备和输出设备的关系
        if ([self.session canAddInput:self.input]) {
            [self.session addInput:self.input];
        }
    
        if ([self.session canAddOutput:self.output]) {
            [self.session addOutput:self.output];
        }
    
        //制定输出设备的代理,用来接收返回的数据
        [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
        //设置元数据类型
        [self.output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    
        //4、创建layer
        self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
        self.previewLayer.frame = self.view.bounds;
        [self.view.layer addSublayer:self.previewLayer];
    
        //5、启用会话
        [self.session stopRunning];
    
    }


    三、代码封装(动画、手电筒)

    展开全文
  • 二维码知多少

    千次阅读 热门讨论 2014-12-25 22:18:03
    二维码知多少  二维码,现在我们的生活中已经很流行了,买东西,防伪,注册等等生活当中的很多...下面我们就对二维码的一些基础,怎样自己动手画二维码二维码一维码的对比进行展开讨论:     一、基础普及:
  • 美化二维码

    2020-05-02 16:50:50
    二维码内容长度不作控制 大多数互联网技术使用到二维码生成,都是使用开源的包生成,输入字符信息,即可生成一张包含此字符信息的黑白二维码图片: 上面有两个二维码图片,扫码结果都是访问到同个页面,...
  • iOS原生二维码扫描,识别图片中的二维码信息。(赠送扫描动画,电筒?功能让你夜里轻松扫描二维码
  • 最近项目遇到的需求:特定区域扫瞄并识别二维码,支持电筒功能。好记性不如烂笔头,写下来方便后面自己用到。 1.动画部分,这部分可根据自己需要添加(不做过多描述)。 2.开启摄像头。iOS 10相机权限访问添在info...
  • 二维码扫描

    千次阅读 2017-05-26 13:48:27
    scan_bg.jpg ...“二维码扫描”实际上就是通过手机相机扫描『二维码图片』,将『二维码图片』中的字符串数据通过解码的方式解析出来。 实现方式 借助开源库 ZXing Android Embedded 实现
  • 今天突然想到二维码是如何存储信息的,手画二维码是否可行呢。于是就开始各种搜索,最终自己也利用Google的ZXing工具完成了一个生成二维码和解析二维码的简单程序。 一、 二维码生成原理(即工作原理) 二维码官方...
  • 二维码由于不喜欢去查看zxing里面的api。所以就自己研究了下,不过由于时间问题,就只支持版本1.。(其实其他版本类似) 制作前需要了解: 一、版本公式是:(V-1)*4 + 21(V是版本号)最高版本为40 二、数字...
  • JAVA 生成数据表图标LOGO二维码,数据表是JAVA画布手动的,二维码可控制是否有logo图标,整合生成图表标签。
  • 二维码扫码功能对于现在的iOS App开发来说是非常重要的。 通常为了节省开发时间,很多开发者会采用ZXing和ZBar等第三方SDK进行开发。 这样的好处是快速便捷,但是缺点也是在于如果要自定义一部分功能,可能对源码...
  • javaScript生成二维码

    2017-02-16 11:19:22
    javaScript生成二维码改造jqueryqrcodejs使之支持中文能带logo 资料搜索 支持中文 支持自定义logo 快捷键 Markdown及扩展 表格 定义列表 代码块 离线写博客 浏览器兼容 javaScript生成二维码(改造jquery...
  • QRCode 生成二维码

    2017-05-11 13:15:05
    QRCode生成二维码直接百度云下载路径:链接: https://pan.baidu.com/s/1i4VVbdb 密码: bshi QRCode解析二维码直接百度云下载路径:...生成二维码的下载 第一步:复制下载链接:http://www.swetake.com/qrcode/index-e.htm
  • 手绘二维码攻略

    2019-10-09 01:04:01
    今天我们就手动编码生成一个可以被识别的二维码~初次尝试,我们把要编码的文本设置得简单些:"HELLO WORLD",只包含大写字母和空格。相应地,我们要采用 QR 二维码...
  • Java生成解析二维码

    千次阅读 2018-08-05 12:54:09
    Java生成二维码 一、介绍 1. 理解二维码 黑点代表二进制中的1,白点代表二进制中的0,通过1和0的排列组合,在二维空间记录数据。通过图像输入设备,读取其中的内容。 2. 二维码分类 二维码有不同的码制,就码制...
  • 二维码自动扫描完整版

    千次阅读 2017-07-20 17:52:32
    二维码扫描
  • JAVA开发二维码

    2017-04-04 13:40:51
    二维码让我们的生活变得更加方便更加高速,现在就来教大家怎么制作用java来制作二维码当然,网上有很多工具可以一键生成二维码,很方便的,但是,它的局限性也是显而易见的,只能手动生成。因为在开发中有些时候系统...
  • Python 生成二维码

    2020-02-05 16:18:22
    $ wget http://labfile.oss.aliyuncs.com/courses/1126/Sources.zip #这里提供制作二维码所需要的图片资源 $ unzip Sources.zip 由于虚拟环境缺少了一些FreeImage依赖。我们在这里手动添加 / $ mkd...
  • iOS 二维码扫描登录

    千次阅读 2017-11-05 10:27:47
    二维码扫描方面,其实客户端能做的事情相对有限,基本上只需要完成扫描二维码,获取二维码中的字符串然后将该字符串以及用户id发给后端处理就好了。首先介绍一下扫描登录的基本流程。 网页向服务器请求二维码...
  • 微信小程序扫描二维码

    千次阅读 2019-04-09 10:17:57
    想到android这边都是用图片或者动画,突然感觉心情特别的好, 里面的参数自己看吧,看到最下面的实例代码 手动写一下试试 在wx.wxml里面 写一个按钮或者view <view bindtap="click">点我扫一扫</vie...
  • 刚好项目中涉及到了二维码扫描的功能,就记录下Zxing的使用过程,个人擅自添加了电筒到界面,可以给大家一些参考。首先看下效果图如下这个红色的电筒就是自定义加上去的,点击可以切换扫描时候的闪光灯的开关...
  • Python 生成个性二维码

    2019-05-27 18:07:00
    本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小、是否在现有图片的基础上生成、是否生成动态二维码。 本课程主要面向Python3初学者。 1.2 知识点 Python3基础 MyQR库 1.3 效果...
  • 基于ZBard的二维码扫描
  • zxing扫描二维码和识别图片二维码及其优化策略 Posted on 2016-01-08 | In Android | | Visitors | 20213二维码介绍Android中用于二维码相关的库比较少,并且大多数已经不再维护(具体可见...
  • iOS二维码扫描/识别

    千次阅读 2016-07-26 23:31:41
    本文提供了一套完整的二维码扫描与相册二维码识别的方案
  • iOS 二维码扫描相关

    2018-09-07 09:44:01
    最近项目要实现相机扫描二维码功能,具体要求:1、扫描框 2、扫描动画 3、相册识别二维码 4、声音反馈。 记得之前用过三方库做过类似功能,但是也是知其然不知其所以然,然后今天自己用原生api简单封装了一个二维码...
  • 今天在review代码的时候重新整理了一下项目中的原生的二维码...QRCodeScanView 扫描视图, 识别出信息后回有震动提示,可以打开电筒 QRCodeCreateTools 二维码、条形码生成工具,你还可以生成中间带小图标的二维码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,672
精华内容 3,868
关键字:

二维码手画