我有以下代码将输入
CIImage
缩放为MTKView
中的可绘制大小,并在调整纵横比后将其居中。但图像位置并不总是适合所有长宽比,不知道为什么。特别是对于方形图像,我得到 (1080, 1080) 和 (2160,2160) 图像的不同位置,这两个图像都不居中。我做错了什么?
func drawCIImage(_ ciImage:CIImage?) {
guard let image = ciImage,
let currentDrawable = currentDrawable,
let commandBuffer = commandQueue?.makeCommandBuffer()
else {
return
}
let drawableSize = self.drawableSize
let adjustedDrawableSize = AVMakeRect(aspectRatio: CGSize(width: image.extent.width, height: image.extent.height), insideRect: CGRect(x: 0, y: 0, width: drawableSize.width, height: drawableSize.height)).size
let scaleX = adjustedDrawableSize.width / image.extent.width
let scaleY = adjustedDrawableSize.height / image.extent.height
NSLog("Adjusted size \(adjustedDrawableSize), \(drawableSize), \(image.extent), \(scaleX), \(scaleY)")
let scaledImage = image.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY).translatedBy(x: (drawableSize.width - adjustedDrawableSize.width)/2, y: (drawableSize.height - adjustedDrawableSize.height)/2)).composited(over: CIImage.red.clampedToExtent())
let destination = CIRenderDestination(width: Int(drawableSize.width),
height: Int(drawableSize.height),
pixelFormat: self.colorPixelFormat,
commandBuffer: commandBuffer,
mtlTextureProvider: { () -> MTLTexture in
return currentDrawable.texture
})
destination.colorSpace = metalLayer.colorspace
_ = try? context.startTask(toRender: scaledImage, to: destination)
commandBuffer.present(currentDrawable)
commandBuffer.commit()
}
编辑:以下代码有效,不确定有什么区别:
var scaledImage = image.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY))
scaledImage = scaledImage.transformed(by: CGAffineTransform(translationX: (drawableSize.width - adjustedDrawableSize.width)/2, y: (drawableSize.height - adjustedDrawableSize.height)/2))
scaledImage = scaledImage.composited(over: CIImage.black.clampedToExtent())
在未经编辑的代码中,您在缩放
translatedBy
上调用了 CGAffineTransform
,它将两个操作连接成一个变换(通过矩阵乘法)。在这种情况下,翻译需要基于原始图像尺寸,而不是缩放后的尺寸。
依次执行这两个操作会更容易,就像您在编辑的代码中所做的那样。