gpt4 book ai didi

ios - 从 MtlTexture getBytes 创建 CVPixelBufferRef

转载 作者:行者123 更新时间:2023-12-02 07:57:28 25 4
gpt4 key购买 nike

尝试在 SCNRender 对象的每次调用渲染上从 MTLTexture 创建 CVPixelBufferRef:

  CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
let bytesPerRow = 4 * Int(textureSizeX)
let region = MTLRegionMake2D(0, 0, Int(textureSizeX), Int(textureSizeY))

var tmpBuffer = CVPixelBufferGetBaseAddress(pixelBuffer!);

offscreenTexture.getBytes(tmpBuffer!, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)

CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))

然后转换为UIImage显示在屏幕上

    let ciImage = CIImage.init(cvPixelBuffer: pixelBuffer!)
let temporaryContext = CIContext(options: nil)
let tempImage = temporaryContext.createCGImage(ciImage, from: CGRect(x: 0, y: 0, width: textureSizeX, height: textureSizeY))
let uiImage = UIImage.init(cgImage: tempImage!)

但图像未显示

最佳答案

我遇到了同样的问题并找到了以下解决方案。它就像一个魅力:)

func image(from texture: MTLTexture) -> UIImage? {
let bytesPerPixel = 4

// The total number of bytes of the texture
let imageByteCount = texture.width * texture.height * bytesPerPixel

// The number of bytes for each image row
let bytesPerRow = texture.width * bytesPerPixel

// An empty buffer that will contain the image
var src = [UInt8](repeating: 0, count: Int(imageByteCount))

// Gets the bytes from the texture
let region = MTLRegionMake2D(0, 0, texture.width, texture.height)
texture.getBytes(&src, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)

// Creates an image context
let bitmapInfo = CGBitmapInfo(rawValue: (CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue))
let bitsPerComponent = 8
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: &src, width: texture.width, height: texture.height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)

// Creates the image from the graphics context
guard let dstImage = context?.makeImage() else { return nil }

// Creates the final UIImage
return UIImage(cgImage: dstImage, scale: 0.0, orientation: .up)
}

来源:https://www.invasivecode.com/weblog/metal-image-processing您可能还感兴趣:https://github.com/hollance/CoreMLHelpers/tree/master/CoreMLHelpers

关于ios - 从 MtlTexture getBytes 创建 CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com