iOS OC 学习手册iOS移动端开发

iOS自定义相机拍身份证照片裁剪图片截出身份证大小

2017-11-09  本文已影响36人  让我走的潇洒一点

最近在做一个项目,有身份证照片的需求,然后领导说要在相机上加一个橘色边框,然后加个提示框,提示用户“尝试将身份证置于边框”进行拍照。类似下面这种边框

3161EAC403787DDF06329B97A6F9D30E.png

然后我就咔咔咔一顿代码,做成了下面这种,看着还可以

IMG_2651.PNG

然后给领导演示了一边,领导又发话了,照片展示的时候只要中间这块身份证就好了,其他的截掉,然后就开始坑了,中间有很多mmp不知当讲不当讲(是在裁剪的时候遇到坑)。

下面开始讲代码部分:

自定义相机部分 AVCaptureDevice 类、 AVCaptureDeviceInput 类、AVCaptureSession类可以查到相关用法。

最主要讲裁剪部分

#pragma mark - 选择照片 返回上级
- (void)selectImage{
    
    //self.image是拍照所得的照片
    UIImage *image1 = self.image;
    
    CGImageRef cgRef = image1.CGImage;
    
    //实际照片大小与屏幕大小之比
    CGFloat widthScale = image1.size.width / ScreenWidth;
    CGFloat heightScale = image1.size.height / ScreenHeight;
    
    //我们所拍照片其实是横屏的
    //多减掉50是因为最后的效果图片的高度有偏差,不知道原因
    CGFloat orignWidth = 226-50;//226
    CGFloat orginHeight = 360;//360
    
    //我们要裁剪出实际边框内的图片,但是实际的照片我们看见的屏幕上的图片,size是不一样,可以打印一下照片的size看看起码好几千的像素,要不然手机拍的照片怎么都是好几兆的呢?
    //以下需要裁剪出的rect是相对于实际照片的rect,所以要进行 比例算法
    //看下面那张图,所以呢,我们计算x的时候要用屏幕的高度来计算,计算y的时候要用屏幕的宽来计算。有兴趣的可以试着反过来计算测试一下,截出的图是怎么样的。
    CGFloat x = (ScreenHeight - orginHeight) * 0.5 * heightScale;
    CGFloat y = (ScreenWidth - orignWidth) * 0.5 * widthScale;
    CGFloat width = orginHeight * heightScale;
    CGFloat height = orignWidth * widthScale;
    
    CGRect r = CGRectMake(x, y, width, height);
    
    CGImageRef imageRef = CGImageCreateWithImageInRect(cgRef, r);
    
    UIImage *thumbScale = [UIImage imageWithCGImage:imageRef];
    //
    image1 = thumbScale;
    
    self.image = image1;
    
    //返回的时候把图片传回去
    self.imageblock(self.image);
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
}
屏幕快照 2017-11-09 下午4.21.09.png

最后就是结果的呈现,可以看一下

拍照的时候这么大

IMG_2653.JPG

截出的图这么小

IMG_2652.JPG

我想之所以截出的图还是带有一点点的桌子的木头色,是因为(x,y)都是按照橘色边框的尖尖角开始算的,毕竟那确实是边框的(x,y)的起始点,假如说想要很精确的话,可是让UI把边框的橘色部分像素给小,或者自己在裁剪的时候把这部分的像素减掉。

有什么不对的地方可以留言哦。
项目地址 https://gitee.com/dumdum/PhotoDemo

上一篇 下一篇

猜你喜欢

热点阅读