最近在做一個項目扫责,有身份證照片的需求吃谣,然后領(lǐng)導(dǎo)說要在相機上加一個橘色邊框,然后加個提示框鲫惶,提示用戶“嘗試將身份證置于邊框”進行拍照蜈首。類似下面這種邊框
然后我就咔咔咔一頓代碼,做成了下面這種欠母,看著還可以
然后給領(lǐng)導(dǎo)演示了一邊欢策,領(lǐng)導(dǎo)又發(fā)話了,照片展示的時候只要中間這塊身份證就好了赏淌,其他的截掉踩寇,然后就開始坑了,中間有很多mmp不知當(dāng)講不當(dāng)講(是在裁剪的時候遇到坑)六水。
下面開始講代碼部分:
自定義相機部分 AVCaptureDevice 類俺孙、 AVCaptureDeviceInput 類、AVCaptureSession類可以查到相關(guān)用法掷贾。
最主要講裁剪部分
#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
//我們要裁剪出實際邊框內(nèi)的圖片,但是實際的照片我們看見的屏幕上的圖片想帅,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];
}
最后就是結(jié)果的呈現(xiàn)蚕礼,可以看一下
拍照的時候這么大
截出的圖這么小
我想之所以截出的圖還是帶有一點點的桌子的木頭色,是因為(x,y)都是按照橘色邊框的尖尖角開始算的梢什,畢竟那確實是邊框的(x,y)的起始點奠蹬,假如說想要很精確的話,可是讓UI把邊框的橘色部分像素給小嗡午,或者自己在裁剪的時候把這部分的像素減掉囤躁。
有什么不對的地方可以留言哦。
項目地址 https://gitee.com/dumdum/PhotoDemo