美文网首页常看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