在MTKView中居中渲染小的CIImage

3
我正在将一个 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 在责怪Metal或CoreImage之前,我想确保我没有做错什么。
我希望能提供一个链接到说明文档的网址,以证明我不能做这样的事情。

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个回答

4
这很奇妙。如果你使用“新”的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(…)似乎无法尊重图像的翻译或给定边界。也许其他人知道更多……


太棒了。这实际上证明了在核心图像中出现了问题。非常感谢。 - Dannie P
有趣。你是否有参考文档来支持这一点? - Dannie P
哦,是的,在WWDC 2017的“核心图像进展”演示中提到了这一点:https://developer.apple.com/videos/play/wwdc2017/510/?time=1393 - Frank Rupprecht
啊,获取“currentDrawable”在最后可能的时刻的建议。我刚刚重新查看了那个视频,你是对的,确实提到了那一点。但对我来说有趣的是,我没有看到在我的应用程序中使用该技术会有任何改进 - 可能是因为我只发出了一个渲染任务,接下来的一行是“presentDrawable”,它无论如何都会捕获可绘制对象。也许在发出多个渲染任务时,这种技术会有所帮助。感谢链接该视频! - Dannie P
我认为这是因为你所做的事情(至少在演示应用程序中)非常简单,无论如何都不需要太多处理。对于更复杂的情况,它可能是有益的。 - Frank Rupprecht
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接