Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何调整MTLTexture的大小/比例_Ios_Swift_Metal - Fatal编程技术网

Ios 如何调整MTLTexture的大小/比例

Ios 如何调整MTLTexture的大小/比例,ios,swift,metal,Ios,Swift,Metal,我有一个MTLTexture,它的大小与它显示的MTL视图的大小相同。但是,我正在将纹理写入AvassetWriterInputPixelBufferAdapter,以录制要求纹理为标准视频大小(即1280x720)的视频 目前,我正在使用MTLRegionMake2D指定纹理中要提取的区域。在一部宽大的手机上,裁剪的效果并不明显。但在形状和尺寸更为方形的iPad上,这种裁剪是显而易见的。理想情况下,我会首先调整纹理的大小,使其与视频的宽度或高度相同,然后裁剪其余部分(而不仅仅是裁剪) 调整MT

我有一个MTLTexture,它的大小与它显示的MTL视图的大小相同。但是,我正在将纹理写入
AvassetWriterInputPixelBufferAdapter
,以录制要求纹理为标准视频大小(即1280x720)的视频

目前,我正在使用
MTLRegionMake2D
指定纹理中要提取的区域。在一部宽大的手机上,裁剪的效果并不明显。但在形状和尺寸更为方形的iPad上,这种裁剪是显而易见的。理想情况下,我会首先调整纹理的大小,使其与视频的宽度或高度相同,然后裁剪其余部分(而不仅仅是裁剪)

调整MTLTexture大小的适当方法是什么

示例代码:

guard let pixelBufferPool = assetWriterPixelBufferInput.pixelBufferPool else { return }

var maybePixelBuffer: CVPixelBuffer? = nil
let status  = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &maybePixelBuffer)
if status != kCVReturnSuccess { return }

guard let pixelBuffer = maybePixelBuffer else { return }

CVPixelBufferLockBaseAddress(pixelBuffer, [])
let pixelBufferBytes = CVPixelBufferGetBaseAddress(pixelBuffer)!

let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
let region = MTLRegionMake2D(0, 0, Int(videoSize.width), Int(videoSize.height))

texture.getBytes(pixelBufferBytes, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)

let frameTime = CACurrentMediaTime()
let presentationTime = CMTimeMakeWithSeconds(frameTime, 240)
assetWriterPixelBufferInput.append(pixelBuffer, withPresentationTime: presentationTime)

CVPixelBufferUnlockBaseAddress(pixelBuffer, [])

最后,我使用
MPSImageLanczosScale
缩放纹理,请参见:

苹果文档:

例如:


在重新缩放之后,我仍然需要使用一个区域来裁剪剩余部分。我有一些逻辑来检测纵向/横向,平板电脑或手机来确定合适的作物。在我的例子中(对于纵向),我选择了垂直居中,让一个瘦小的设备(手机)裁剪顶部/底部,而水平居中,让一个宽大的设备(平板电脑)裁剪左侧/右侧。对于横向有类似的逻辑,但相反。

您应该能够生成一个较小的MPS图像,并在矩阵中进行适当的转换以进行裁剪。这将节省工作和记忆,总体上会更好。谢谢你的建议@Ian Ollmann。是的,我不能评论这种方法有多有效,但它奏效了。谢谢你的提示。