ios - CVPixelBuffer 导致设备上产生垃圾图像,而在模拟器上按预期工作

标签 ios swift cvpixelbuffer

我正在尝试用人工创建的数据创建图像,并希望使用 CVPixelBuffer:

    private func RGBAImage(width w: Int, height h: Int) -> UIImage? {

        let width = w * Int(UIScreen.main.scale)
        let height = h * Int(UIScreen.main.scale)

        // Prepare artificial data

        let dataPtr = UnsafeMutablePointer<UInt8>.allocate(capacity: width * height * 4)

        for i in 0..<width {
            for j in 0..<height {
                dataPtr[4 * (i + j * width)] = UInt8(sin(Double(i) * 0.01 * .pi / Double(UIScreen.main.scale)) * 127 + 127)
                dataPtr[4 * (i + j * width) + 1] = UInt8(255)
                dataPtr[4 * (i + j * width) + 2] = UInt8(0)
                dataPtr[4 * (i + j * width) + 3] = UInt8(0)
            }
        }

        // Convert data into CVPixelBuffer

        var pxBuffer: CVPixelBuffer?

        CVPixelBufferCreateWithBytes(
            kCFAllocatorDefault,
            width,
            height,
            kCVPixelFormatType_32ARGB,
            dataPtr,
            width * 4,
            nil,
            nil,
            [kCVPixelBufferIOSurfacePropertiesKey: [:]] as CFDictionary,
            &pxBuffer
        )

        dataPtr.deallocate()

        guard let cvPxBuffer = pxBuffer else {
            return nil
        }

        // Generate image from CVPixelBuffer

        let ciImage = CIImage(cvImageBuffer: cvPxBuffer)

        return UIImage(ciImage: ciImage, scale: UIScreen.main.scale, orientation: .up)
    }

代码在模拟器上运行良好,显示如下:

enter image description here

但是相同的代码在设备上显示垃圾结果:

enter image description here

我在这里缺少什么?欢迎任何建议。

最佳答案

我自己想通了。我仍然不知道为什么 CVPixelBufferCreateWithBytes 不起作用,但我可以通过使用 CVPixelBufferCreate 创建像素缓冲区并将每个 RGB 地址的值设置为 1 来使其工作一个。这也应该是一个更好的方法,因为我不需要先创建一个数组。

这是设备和模拟器的工作代码:

    private func RGBAImage(width w: Int, height h: Int) -> UIImage? {

        let width = w * Int(UIScreen.main.scale)
        let height = h * Int(UIScreen.main.scale)
        let bytesPerPixel = 4

        // Create CVPixelBuffer with artificial data

        var pxBuffer: CVPixelBuffer?

        CVPixelBufferCreate(
            kCFAllocatorDefault,
            width,
            height,
            kCVPixelFormatType_32ARGB,
            nil,
            &pxBuffer)

        guard let cvPxBuffer = pxBuffer else {
            return nil
        }

        CVPixelBufferLockBaseAddress(cvPxBuffer, CVPixelBufferLockFlags(rawValue: 0))
        let bufferWidth = Int(CVPixelBufferGetWidth(cvPxBuffer))
        let bufferHeight = Int(CVPixelBufferGetHeight(cvPxBuffer))
        let bytesPerRow = CVPixelBufferGetBytesPerRow(cvPxBuffer)

        guard let baseAddress = CVPixelBufferGetBaseAddress(pxBuffer!) else {
            return nil
        }

        for row in 0..<bufferHeight {
            var pixel = baseAddress + row * bytesPerRow
            for col in 0..<bufferWidth {
                let alpha = pixel
                alpha.storeBytes(of: UInt8(sin(Double(col) * 0.01 * .pi / Double(UIScreen.main.scale)) * 127 + 127), as: UInt8.self)

                let red = pixel + 1
                red.storeBytes(of: 255, as: UInt8.self)

                let green = pixel + 2
                green.storeBytes(of: 0, as: UInt8.self)

                let blue = pixel + 3
                blue.storeBytes(of: 0, as: UInt8.self)

                pixel += bytesPerPixel;
            }
        }

        CVPixelBufferUnlockBaseAddress(cvPxBuffer, CVPixelBufferLockFlags(rawValue: 0))

        // Generate image from CVPixelBuffer
        let ciImage = CIImage(cvImageBuffer: cvPxBuffer)

        return UIImage(ciImage: ciImage, scale: UIScreen.main.scale, orientation: .up)
    }

关于ios - CVPixelBuffer 导致设备上产生垃圾图像,而在模拟器上按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483707/

相关文章:

ios - Facebook.com 和 iOS7 Captive Portal 检测

swift - 为什么 Swift 不强制我指定的初始化程序调用 super?

objective-c - macOS Swift : How to properly add application as Login Item

swift - TokBox: 'consumeFrame' 在使用修改后的像素缓冲区时崩溃

ios - 将 CVPixelBuffer 放入方形图像中,并调整大小和保存纵横比

ios - UINavigationController Root View (iOS)

javascript - $ (".element").first().trigger ('click' ) - iPad 不工作

ios - 无声推送通知

ios - 为什么我在 tableView 中看到动画前的静态文本

swift - 如何更改 CVPixelBuffer 数据格式