我正在向CIImage
渲染MTKView
,图像小于drawable。
let centered = image.transformed(by: CGAffineTransform(translationX: (view.drawableSize.width - image.extent.width) / 2, y: (view.drawableSize.height - image.extent.height) / 2))
context.render(centered, to: drawable.texture, commandBuffer: buffer, bounds: centered.extent, colorSpace: CGColorSpaceCreateDeviceRGB())
我希望上面的代码将图像渲染到视图的中心,但图像位于原点。
这是解释问题的回购:https://github.com/truemetal/centered-render-of-ciimage-to-mtkview
在责备Metal
或CoreImage
之前,我想确保我没有做错事。
我很欣赏文档的链接,说我不能做那样的事情。
我可以解决这个问题,方法是将图像合成到另一个图像上,这个图像就像drawable的大小一样,但我仍然感兴趣的是为什么上面的代码不能正常工作。
let centered = image.transformed(by: CGAffineTransform(translationX: (view.drawableSize.width - image.extent.width) / 2, y: (view.drawableSize.height - image.extent.height) / 2))
let background = CIImage(color: .white).cropped(to: CGRect(origin: .zero, size: view.drawableSize))
let preparedImage = centered.composited(over: background)
self.context.render(preparedImage, to: drawable.texture, commandBuffer: buffer, bounds: preparedImage.extent, colorSpace: CGColorSpaceCreateDeviceRGB())
这是最好奇的。如果您使用“新”CIRenderDestination
API而不是context.render(…)
它实际上有效:
let destination = CIRenderDestination(width: Int(view.drawableSize.width),
height: Int(view.drawableSize.height),
pixelFormat: view.colorPixelFormat,
commandBuffer: buffer,
mtlTextureProvider: { () -> MTLTexture in
return drawable.texture
})
try! self.context.startTask(toRender: centered, to: destination)
我不知道为什么,但context.render(…)
似乎并不尊重图像的翻译或给定的界限。也许别人知道更多......