美文网首页常看IOS技术iOS_图片相关
iOS:自定义相机[获取指定区域的指定图片]

iOS:自定义相机[获取指定区域的指定图片]

作者: 琪一可 | 来源:发表于2016-09-06 16:35 被阅读5479次

    需求:相机给定一个相框, 让用户将身份证放在相框所在区域, 之后拍照出来的照片就是这个身份证的照片。 支持前后镜头。 (ps:虽然不知道经理为什么要这个转换镜头的需求..) 能够直接存入相册。

    示意图.png

    上面这个图片是我自己画的, 主要是看功能, 不必在意界面, demo中的界面类似, 但不是一致的。

    1

    这里注意的是在存入相册时候, 不再使用<AssetsLibrary/AssetsLibrary.h>而是<Photos/Photos.h>, 前者已经废弃了。

    - (void)writeToSavedPhotos
    {
        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
        if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
            NSLog(@"无权限访问相册");
            return;
        }
        
        // 首先判断权限
        if ([self haveAlbumAuthority]) {
            //写入相册
            //这里的selector只能写这个方法
            UIImageWriteToSavedPhotosAlbum(self.image, self, @selector(image: didFinishSavingWithError:contextInfo:), nil);
            
        }
    }
    

    判断权限

    - (BOOL)haveAlbumAuthority
    {
        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
        
        if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
            return NO;
        }
        return YES;
        
    }
    

    2

    为了剪裁效果准确, 这里的类型使用AVLayerVideoGravityResize, demo里面使用的是别的类型, 记得修改哦。ps:评论区有伙伴说这个属性不是按比例的,预览视图会变形的。那么大家可以试试,用用其它属性哈。谢谢大家的指正。

      // 初始化预览层
        self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
        
        [self.previewLayer setVideoGravity:AVLayerVideoGravityResize];
        self.previewLayer.frame = self.bounds;
        [self.layer addSublayer:self.previewLayer];
    

    本demo也借鉴了一些博客的内容, 具体我也没记, 总之谢谢大家的共享, 我又根据自己的需求写了个demo, 希望能帮助到别人。

    demo

    相关文章

      网友评论

      • f1b498cc8499:怎么优化拍照范围不准的问题啊,求指教我扣扣314366258
      • _码奴:系统相机是怎么实现拍摄正方形照片的????
      • _码奴:自定义相机的时候只能通过拍照完成后裁剪才能获取正方形图片吗,不能直接设置某个属性变成正方形吗
      • afd8db8f2982:楼主 这拍照就糊了 怎么回事
      • Caiflower:图片变形的问题有点忧伤
        afd8db8f2982:哥们 解决了吗 这拍照就糊了
      • writeSpace:demo 一拍照就蹦亏
        Error Domain=AVFoundationErrorDomain Code=-11852 "Cannot use Back Camera" UserInfo={NSLocalizedDescription=Cannot use Back Camera, NSLocalizedFailureReason=This app is not authorized to use Back Camera., AVErrorDeviceKey=<AVCaptureFigVideoDevice: 0x10030a8c0 [Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]>}
        晓龙歌:应该是之前的Demo 没有请求相机权限导致的
      • 兔子守护窝边草:请问拍出来的照片模糊是什么原因,有办法解决么?
        afd8db8f2982:哥们 解决了吗
      • 喵呜小欣仔:有没有demo给看看呀
        喵呜小欣仔:@琪一可 当时没看见:smile: 好尴尬
        琪一可:@喵呜小欣仔 里面有链接:flushed:
      • 马铃薯蜀黍:为什么你的代码真机调试的时候控制台依然可以打印?
      • _RichardLee:楼主现在有什么新的发现吗?
        琪一可:@_JasonLee :fist: 嗯。。。取到信息先 :smile:
        _RichardLee:@琪一可 我简单的实现了,就是用你的缩放比例方法,先把照片缩放直屏幕的宽高,在截取想要的区域,这样就不会出现压缩的现象了,毕竟是要中间信息。
        琪一可:@_JasonLee 暂时没有。。 :flushed: :flushed: 。。。。。。
      • 一号线:预览层设置成AVLayerVideoGravityResize 这个属性不是按比例的,预览视图会变形的
        琪一可:@一号线 嗯 好的吧 我再研究一下 :flushed:
        一号线:@琪一可 我还是用的 AVLayerVideoGravityResizeAspectFill ,最后按比例缩放图片,裁剪指定区域。
        琪一可:@一号线 哦哦哦 谢谢哈 当时我写的时候记得不改这个属性会出现一个问题 就是剪裁出来的图片会有偏移。 :flushed: 所以写了这个属性。。 demo里面用的是AVLayerVideoGravityResizeAspectFill, 就有这个问题。 所以按照你说的 应该改成什么比较好。。? :flushed:

      本文标题:iOS:自定义相机[获取指定区域的指定图片]

      本文链接:https://www.haomeiwen.com/subject/svbdettx.html