我面临的问题是从相机拍摄的图像比实时取景中显示的图像大。我将相机视图设置为宽高比填充。
所以我从相机获得的图像约为 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(中的图像相同。
正如您已经指出的,内容模式选项"方面填充"尝试填充实时视图,您也对,它从中心裁剪了一些矩形(根据图像大小和图像视图大小裁剪上下或左右
(对于通用解决方案,有两种可能的情况
- 图像需要沿高度裁剪以适合图像视图(比例绘图高度较小(
- 需要沿宽度裁剪图像以适合图像视图(比例绘图宽度较小(
考虑到您的尺寸符号为 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 的原始图像裁剪。