1

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

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

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

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

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

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

imgRawData 是一个 [Int32] 或 [Float32] 数组,其元素个数为 width*height。

var pixelBuffer: CVPixelBuffer?
let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue,
            kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue ]
    
CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, kCVPixelFormatType_14Bayer_RGGB, &imgRawData, 2*width, nil, 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 视图也是如此...

4

1 回答 1

0

您可以CGContext在 as 中使用和传递原始值bitmapinfo,请参见 init:

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

而对于space参数,CGColorSpace您将使用CGColorSpaceCreateDeviceRGB().

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

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

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

于 2021-02-08T08:38:48.900 回答