快速从原始图像获取宽高比填充图像



我面临的问题是从相机拍摄的图像比实时取景中显示的图像大。我将相机视图设置为宽高比填充。

所以我从相机获得的图像约为 4000x3000,显示来自相机的实时馈送的视图为 375x800(全屏 iPhoneX 大小(,所以我如何转换/剪切从相机获取的图像中的部分图像与实时视图中显示的图像相同, 所以我可以进一步操作图像(在它上面绘制(。

据我了解,Aspect Fill 属性会剪辑视图中无法显示的图像。但是该剪辑不会发生在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!)

显示在实时取景(捕获视图(中,其大小为 375x818(宽度:375,高度:818(。

然后我在单击按钮时从该相机获取图像,该图像的大小为:

3024x4032(宽度:3024,高度:4032(

因此,我想做的是将相机中的图像裁剪为与设置为AspectFill类型的实时取景(captureView(中的图像相同。

正如您已经指出的,内容模式选项"方面填充"尝试填充实时视图,您也对,它从中心裁剪了一些矩形(根据图像大小和图像视图大小裁剪上下或左右

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

  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的工作原理感兴趣,可以深入研究这里。此处模拟了UIImageView支持的所有contentMode

快乐编码。

更新

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

let originalYPosition = (croppedYPosition / 375) * 4000

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

相关内容

  • 没有找到相关文章