渲染以MTKView为中心的小型CIImage

时间:2019-02-19 19:23:14

标签: ios swift metal core-image metalkit

我正在将CIImage渲染到MTKView,并且图像小于可绘制对象。

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

在指责MetalCoreImage之前,我想确保自己没有做错什么。

我非常感谢指向文档的链接,该链接指出我无法执行此类操作。

problem screenshot

我可以通过将图像合成到另一个恰好是可绘制对象大小的图像上来解决此问题,但是我仍然对为什么上面的代码无法正常工作感兴趣。

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())

1 个答案:

答案 0 :(得分:0)

这很好奇。如果您使用“新的” 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(…)似乎并不尊重图像的翻译或给定的界限。也许其他人知道更多...