最近在做一個(gè)項(xiàng)目,有身份證照片的需求,然后領(lǐng)導(dǎo)說要在相機(jī)上加一個(gè)橘色邊框,然后加個(gè)提示框,提示用戶“嘗試將身份證置于邊框”進(jìn)行拍照。類似下面這種邊框

3161EAC403787DDF06329B97A6F9D30E.png
然后我就咔咔咔一頓代碼,做成了下面這種,看著還可以
IMG_2651.PNG
然后給領(lǐng)導(dǎo)演示了一邊,領(lǐng)導(dǎo)又發(fā)話了,照片展示的時(shí)候只要中間這塊身份證就好了,其他的截掉,然后就開始坑了,中間有很多mmp不知當(dāng)講不當(dāng)講(是在裁剪的時(shí)候遇到坑)。
下面開始講代碼部分:
自定義相機(jī)部分 AVCaptureDevice 類、 AVCaptureDeviceInput 類、AVCaptureSession類可以查到相關(guān)用法。
最主要講裁剪部分
#pragma mark - 選擇照片 返回上級(jí)
- (void)selectImage{
//self.image是拍照所得的照片
UIImage *image1 = self.image;
CGImageRef cgRef = image1.CGImage;
//實(shí)際照片大小與屏幕大小之比
CGFloat widthScale = image1.size.width / ScreenWidth;
CGFloat heightScale = image1.size.height / ScreenHeight;
//我們所拍照片其實(shí)是橫屏的
//多減掉50是因?yàn)樽詈蟮男Ч麍D片的高度有偏差,不知道原因
CGFloat orignWidth = 226-50;//226
CGFloat orginHeight = 360;//360
//我們要裁剪出實(shí)際邊框內(nèi)的圖片,但是實(shí)際的照片我們看見的屏幕上的圖片,size是不一樣,可以打印一下照片的size看看起碼好幾千的像素,要不然手機(jī)拍的照片怎么都是好幾兆的呢?
//以下需要裁剪出的rect是相對(duì)于實(shí)際照片的rect,所以要進(jìn)行 比例算法
//看下面那張圖,所以呢,我們計(jì)算x的時(shí)候要用屏幕的高度來計(jì)算,計(jì)算y的時(shí)候要用屏幕的寬來計(jì)算。有興趣的可以試著反過來計(jì)算測(cè)試一下,截出的圖是怎么樣的。
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;
//返回的時(shí)候把圖片傳回去
self.imageblock(self.image);
[self dismissViewControllerAnimated:YES completion:nil];
}

屏幕快照 2017-11-09 下午4.21.09.png
最后就是結(jié)果的呈現(xiàn),可以看一下
拍照的時(shí)候這么大
IMG_2653.JPG
截出的圖這么小
IMG_2652.JPG
我想之所以截出的圖還是帶有一點(diǎn)點(diǎn)的桌子的木頭色,是因?yàn)椋▁,y)都是按照橘色邊框的尖尖角開始算的,畢竟那確實(shí)是邊框的(x,y)的起始點(diǎn),假如說想要很精確的話,可是讓UI把邊框的橘色部分像素給小,或者自己在裁剪的時(shí)候把這部分的像素減掉。
有什么不對(duì)的地方可以留言哦。
項(xiàng)目地址 https://gitee.com/dumdum/PhotoDemo