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

Posted

技术标签:

【中文标题】如何在 Swift 中将数值数据数组转换为 RAW 图像数据?【英文标题】:How to convert a numerical data array into RAW image data in Swift? 【发布时间】:2021-05-11 20:24:06 【问题描述】:

我有一个 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 的 Quickview 只显示黑白或灰度图像。 CGImage 的 SwiftUI 视图也是如此...

【问题讨论】:

你看到这个问题了吗?可能会有所帮助***.com/q/51372245/10595176 谢谢。我去看看! 我检查了...这很接近,但并不完全相同。在这种情况下,图像已经作为 RGBA 可用,即去马赛克。我希望 iOS 对我的原始图像数据 (RGGB-CFA) 进行去马赛克处理。 【参考方案1】:

您可以使用CGContext 并将您的原始值作为bitmapinfo 传递,参见初始化:

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()!)

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

【讨论】:

谢谢! CGContext 如何知道 CFA,即像素布局?它必须知道它是RGGB。这也将生成 CGImage 而不是 CoreImage,我相信这是原始图像 CIFilter 所必需的。 wiki.hawkguide.com/wiki/… 在格式之间转换时使用本指南 谢谢...我尝试了一些。问题仍然是 CG 和 CI 图像都不知道像素格式 RGGB。不同图像表示之间的转换非常简单。 BitmapInfo 能否用于 RGGB 像素格式 (CFA)? 我发现了这个相关的问题......我遇到了同样的障碍:quabr.com/42261344/…

以上是关于如何在 Swift 中将数值数据数组转换为 RAW 图像数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 Floats 的 ContiguousArray 转换为字节数组?

如何在 Swift 中将十六进制字符串转换为 CString?

如何在 Swift 中将数据转换为 Doubles、Ints 和 Strings 等类型?

如何在 Swift 4 中将 UIImage 转换为字节数组

如何在Swift 4中将UIImage转换为字节数组

如何在 swift 3 中将具有自定义类的数组转换为 JSON