这个问题说难不难,说简单也不简单,笔者当时确实花了很长一段时间才弄清楚,但是当问题解决后,感觉这特么也不复杂啊,之前怎么就没整明白呢
问题是这样的,在使用自定义相机拍完照后,需要对图片的指定区域(蓝色方框内的区域)进行截取然后上传,这里存在两个问题
拍摄时你所看到的区域,跟实际拍出来的区域是不一样的
上图就是实际拍出来的图片,明显比拍摄时看到的图片要长,不过宽度是一样的
-
照片的坐标系与我们平时开发所使用的坐标系是不一样的
开发中所使用的视图坐标系是以左上角为原点的,横向为x轴,纵向为y轴,而拍摄出来的照片是以右上角为原点的,横向为y轴,纵向为x轴
我们先来看一幅图
由于拍摄时所看到视图宽高比与实际拍摄出来的图片的宽高比并不一致,所以导致图片经过等比例缩放到宽度一样时,高度有一部分超出了我们的可视范围,首先,我们要计算出超出部分的高度
1
2
3
4
|
//_cameraView为相机视图,即拍摄时看到图片的区域
CGFloat scale = image.size.width / _cameraView.width;
//计算出缩放的比例
CGFloat showImageH = image.size.height / scale;
//缩放后图片的高度
CGFloat offsetY = (showImageH - _cameraView.height) * 0.5;
//上下超出的部分是相等的,所以*0.5得出上面超过的部分
|
超出部分的高度计算完后,我们就要来计算蓝色方框(_circleView,_cameraView的子控件)的坐标了
1
2
3
4
|
x:(offsetY+_circleView.y) * scale,别忘了乘以缩放比例
y:_circleView.x * scale,因为circleView在父控件中水平居中,所以_circleView在父控件中的x值乘以缩放比就是在图片坐标系中的y值
width:_circleView.height scale
height:_circleView.width scale
|
然后根据计算好的frame截取图片就ok了
1
2
3
|
CGRect rect = CGRectMake(x, y, width,height);
CGImageRef tailorImageRef = CGImageCreateWithImageInRect(photo.CGIma
|