1

人工的に作成されたデータから画像を作成しようとしており、使用したい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)
    }

コードはシミュレーターで正常に動作し、次のように表示されます。

ここに画像の説明を入力

しかし、同じコードはデバイス上でガベージ結果を示しています:

ここに画像の説明を入力

ここで何が欠けていますか?どんな提案でも大歓迎です。

4

1 に答える 1