快速从原始图像中获取纵横比填充图像

时间:2018-10-23 15:10:45

标签: ios swift swift4

我面临的问题是,从相机拍摄的图像要比实时取景中显示的图像大。我将相机视图设置为“纵横比填充”。

因此,我从相机获得的图像约为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类型的图像相同。

1 个答案:

答案 0 :(得分:0)

正如您已经陈述的那样,内容模式选项“纵横比填充”试图填充实时视图,并且您还正确地将其从中心裁剪了一些矩形(裁剪上下或左右,具体取决于图像尺寸和图像视图)大小)

对于通用解决方案,可能有两种情况

  1. 需要沿着高度裁剪图像以适合图像视图(比例绘图高度较小)
  2. 需要沿着宽度裁剪图像以适合图像视图(比例绘图宽度较小)

考虑到您的尺寸符号为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的全部工作方式感兴趣,可以深入herecontentMode支持的所有UIImageView在此处都是模拟的。

快乐的编码。

更新

我忘了提到的一件事,这个计算的croppedYPosition是用于较小比例的图像。如果要将这个值用于原始4000X3000图像,则必须按如下所示将其放大为原始值

let originalYPosition = (croppedYPosition / 375) * 4000

使用originalYPosition从大小为4000X3000的原始图像中裁剪。