如何解决如何在 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)
对于需要 space
的 CGColorSpace
参数,您可以使用 CGColorSpaceCreateDeviceRGB()
。
然后,您将使用与此类似的代码来使用您的图像:
let imageRef = CGContext.makeImage(context!)
let imageRep = NSBitmapImageRep(cgImage: imageRef()!)
玩一会儿,我想你会找到你想要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。