【问题标题】:Rendering small CIImage centered in MTKView以 MTKView 为中心渲染小 CIImage
【发布时间】:2019-07-13 09:17:06
【问题描述】:

我正在将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())

我希望上面的代码将图像呈现在视图的中心,但图像却位于原点。

这里是说明问题的 repo:https://github.com/truemetal/centered-render-of-ciimage-to-mtkview

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

如果有一个文档链接说我不能做这样的事情,我将不胜感激。

我可以通过将图像合成到另一个与可绘制对象大小完全相同的图像上来解决这个问题,但我仍然对为什么上面的代码不起作用感兴趣。

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

【问题讨论】:

    标签: ios swift metal core-image metalkit


    【解决方案1】:

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

    【讨论】:

    • 太棒了。这实际上向我证明了核心形象内部出现了问题。非常感谢。
    • 我发现这个稍短一些的对应物同样适用let destination = CIRenderDestination(mtlTexture: drawable.texture, commandBuffer: commandBuffer)
    • 是的,带有回调的版本具有交错纹理获取和渲染的优势,因此在每秒渲染多帧时效率更高。
    • 有趣。你有没有参考文档来支持这一点?
    • 哦,是的,它在 WWDC 2017 的“Advances in Core Image”演示文稿中提到:developer.apple.com/videos/play/wwdc2017/510/?time=1393
    猜你喜欢
    • 2021-11-25
    • 2019-04-02
    • 2021-12-29
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2018-06-12
    相关资源
    最近更新 更多