如何在 Swift 中将数值数据数组转换为 RAW 图像数据?

问题描述

我有一个 Int16 或 Int32 数值的数据数组,它们是来自具有 RGGB 像素布局 (CFA) 的 11MP 相机芯片的原始图像数据。数据由相机驱动程序导出为 FITS 数据,在我的情况下,它基本上是一个向量或长字节串或 16 位/像素数据。

我喜欢在 Swift 中将这些数据转换为原始图像格式,以便使用 iOS/Swift 中强大的 debayering 和去马赛克功能和算法。我不打算对自己进行去马赛克处理,因为 iOS 已经有一个很棒的库(请参阅 WWDC2016 关于Raw Processing with Core Image主题演讲)。

我需要让 iOS “相信”我的数据是实际的原始图像数据。

我尝试在 Swift 中使用 CreatePixelBufferWithBytes,然后从 pixelbuffer 使用 CIImage 但无济于事。 CIImage.cgimage 不是 RGB 彩色图像。

是否有一种简单的方法可以在 Swift 中根据原始数值数据创建原始或 DNG 图像?

这是我用 CVPixelBuffer 方法尝试过的方法,但我没有从中得到任何彩色图像:

imgRawData 是一个 [Int32] 或 [Float32] 数组,元素的宽度*高度数。

var pixelBuffer: CVPixelBuffer?
let attrs = [kCVPixelBufferCGImageCompatibilityKey: kcfBooleanTrue,kCVPixelBufferCGBitmapContextCompatibilityKey: kcfBooleanTrue ]
    
CVPixelBufferCreateWithBytes(kcfAllocatorDefault,width,height,kCVPixelFormatType_14Bayer_RGGB,&imgRawData,2*width,nil,attrs as CFDictionary,&pixelBuffer)

let dummyImg = UIImage(systemName: "star.fill")?.cgImage
    
let ciiraw = CIImage(cvPixelBuffer: pixelBuffer!)
    
let cif = CIFilter.lanczosScaleTransform()
cif.scale = 0.25
cif.inputimage  = ciiraw
let cii = cif.outputimage
    
let context: CIContext = CIContext.init(options: nil)
guard let cgi = context.createCGImage(cii!,from: cii!.extent) else { return dummyImg! }

Xcode 的 Quickview 只显示黑白或灰度图像。 CGImage 的 SwiftUI 视图也是如此...

解决方法

您可以使用 CGContext 并将原始值作为 bitmapinfo 传入,请参阅 init:

init?(data: UnsafeMutableRawPointer?,width: Int,height: Int,bitsPerComponent: Int,bytesPerRow: Int,space: CGColorSpace,bitmapInfo: UInt32)

对于需要 spaceCGColorSpace 参数,您可以使用 CGColorSpaceCreateDeviceRGB()

然后,您将使用与此类似的代码来使用您的图像:

let imageRef = CGContext.makeImage(context!)
let imageRep = NSBitmapImageRep(cgImage: imageRef()!)

玩一会儿,我想你会找到你想要的。

相关问答

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