簡體   English   中英

Swift中如何將數值數據數組轉換為RAW圖像數據?

[英]How to convert a numerical data array into RAW image data in Swift?

我有一個 Int16 或 Int32 數值的數據數組,它們是來自具有 RGGB 像素布局 (CFA) 的 11MP 相機芯片的原始圖像數據。 數據由相機驅動程序導出為 FITS 數據,在我的例子中,它基本上是一個向量或長字節串或 16 位/像素數據。

我喜歡將這些數據轉換為 Swift 中的原始圖像格式,以便在 iOS/Swift 中使用強大的去拜耳和去馬賽克功能和算法。 我不打算自己去馬賽克,因為 iOS 已經為此提供了一個很棒的庫(請參閱 WWDC2016 關於使用核心圖像進行原始處理的主題演講)。

我需要讓 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 的快速瀏覽只顯示黑白或灰度圖像。 CGImage 的 SwiftUI 視圖也是如此...

您可以使用CGContext並將原始值作為bitmapinfo ,請參見 init:

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

對於采用CGColorSpacespace參數,您將使用CGColorSpaceCreateDeviceRGB()

然后,您將使用與此類似的代碼來使用您的圖像:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM