最近在做一个项目,有身份证照片的需求,然后领导说要在相机上加一个橘色边框,然后加个提示框,提示用户“尝试将身份证置于边框”进行拍照。类似下面这种边框
然后我就咔咔咔一顿代码,做成了下面这种,看着还可以
然后给领导演示了一边,领导又发话了,照片展示的时候只要中间这块身份证就好了,其他的截掉,然后就开始坑了,中间有很多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];
}
最后就是结果的呈现,可以看一下
拍照的时候这么大
截出的图这么小
我想之所以截出的图还是带有一点点的桌子的木头色,是因为(x,y)都是按照橘色边框的尖尖角开始算的,毕竟那确实是边框的(x,y)的起始点,假如说想要很精确的话,可是让UI把边框的橘色部分像素给小,或者自己在裁剪的时候把这部分的像素减掉。
有什么不对的地方可以留言哦。
项目地址 https://gitee.com/dumdum/PhotoDemo