问题描述
我尝试了很多技术,比如使用 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 (将#修改为@)