我面临的问题是,从相机拍摄的图像要比实时取景中显示的图像大。我将相机视图设置为“纵横比填充”。
因此,我从相机获得的图像约为4000x3000,而显示来自相机的实时供稿的视图为375x800(全屏iPhoneX尺寸),因此我该如何从从相机获得的图像中转换/裁剪图像的一部分摄像机与实时取景中显示的摄像机相同,因此我可以进一步操纵图像(在其上绘制)。
据我了解,“纵横比填充”属性将裁剪无法在视图中显示的图像。但是该剪辑不会发生在X = 0和y = 0上,而是发生在图像中间的某个位置。因此,我如何在原始图像上获得X和Y,以便我可以准确地裁剪出那一部分。
我希望我讲得足够清楚。
编辑:
提供更多背景信息和一些代码段,以使其更容易理解问题。
使用.resizeAspectFill重力设置我的相机。
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
cameraPreviewLayer?.frame = self.captureView.frame
self.captureView.layer.addSublayer(cameraPreviewLayer!)
显示在实时视图(captureView)中,其大小为 375x818(宽度:375,高度:818)。
然后,我通过单击按钮从该摄像机获取图像,该图像的大小为:
3024x4032(宽度:3024和高度:4032)
所以我想做的是从相机中裁剪图像,使其与实时视图(captureView)中设置为AspectFill类型的图像相同。
答案 0 :(得分:0)
正如您已经陈述的那样,内容模式选项“纵横比填充”试图填充实时视图,并且您还正确地将其从中心裁剪了一些矩形(裁剪上下或左右,具体取决于图像尺寸和图像视图)大小)
对于通用解决方案,可能有两种情况
考虑到您的尺寸符号为4000x3000(高度= 4000,宽度= 3000,一幅肖像图像),并且您的绘图画布尺寸为375X800(高度= 375,宽度= 800),那么在设置内容模式时,裁剪将是高度明智的外观填充。
因此裁剪将从X=0
开始,但是Y
会有些积极。因此,让我们计算Y
let propotionalHeight = 4000 / 3000 * 800
let allowedHeight = 375
let topBottomCroppedHeight = proportionalHeight - allowedHeight
let croppedYPosition = topBottomCroppedHeight / 2
因此,您在这里得到了Y
的值。高度将是您渲染的画布/实时视图的高度。请用您的变量替换这些值。
如果您对contentMode
的全部工作方式感兴趣,可以深入here。 contentMode
支持的所有UIImageView
在此处都是模拟的。
快乐的编码。
更新
我忘了提到的一件事,这个计算的croppedYPosition
是用于较小比例的图像。如果要将这个值用于原始4000X3000图像,则必须按如下所示将其放大为原始值
let originalYPosition = (croppedYPosition / 375) * 4000
使用originalYPosition
从大小为4000X3000的原始图像中裁剪。