将 RGBA32Float MTLTextures 转换为 NSImage

问题描述

我尝试了很多技术,比如使用 CIImage 或将数据复制到 uint_32ts 的缓冲区中,但它们都遇到了问题。到目前为止我发现的最简单的是:


extension MTLTexture {
    
    func toImage() -> NSImage? {
        
        assert (pixelFormat == .rgba32Float)
        let rowByteCount = width * 16
        let bytes = UnsafeMutablePointer<Float>.allocate(capacity: width * height * 4)
        defer {
            bytes.deallocate()
        }
        getBytes(bytes,bytesPerRow: rowByteCount,from: MTLRegion(origin: MTLOrigin(x: 0,y: 0,z: 0),size: MTLSize(width: width,height: height,depth: 1)),mipmapLevel: 0)
        let context = CGContext(data: bytes,width: width,bitsPerComponent: 32,space: CGColorSpaceCreateDeviceRGB(),bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.floatComponents.rawValue)
        guard let cgImage = context?.makeImage() else { print("Failed making cgImage"); return nil }
    
        return NSImage(cgImage: cgImage,size: NSSize(width: width,height: height))
    }
    
}

这会创建一个大小正确的图像,但它是完全透明的。有时在使用预览放大时,图像中某些特征的轮廓会闪烁,但一旦图像渲染它就会消失。我确保同步图像,并确保 bytes 缓冲区具有非零值。我还尝试使用 SIMD4<Float> 的缓冲区而不是 Float 的缓冲区,但它产生了相同的结果。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...