这是我目前所拥有的。我想知道是否有一种更优雅的方式来实现它,或者更好的是,一种方法将我的数组转换为所需类型而不迭代整个结构。
我的输入是包含像素数据的CFDataRef
。我想将它转换为像素数组。
struct Pixel {
let r: UInt8
let g: UInt8
let b: UInt8
let a: UInt8
}
var intArray = [UInt8](count: CFDataGetLength(data), repeatedValue: 0)
let dataRange = CFRangeMake(0, CFDataGetLength(data))
CFDataGetBytes(data, dataRange, &intArray)
var pixelArray : [Pixel] = []
for var i = 0; i < intArray.count; i += 4 {
let p = Pixel(r: intArray[i], g: intArray[i+1], b: intArray[i+2], a: intArray[i+3])
pixelArray.append(p)
}
答案 0 :(得分:1)
感谢@ GoZoner的提示,我在Apple DevForums上找到了this thread。以下是我最终的,有效的解决方案。
struct Pixel {
let r: UInt8
let g: UInt8
let b: UInt8
let a: UInt8
}
let data: CFData! = ...
let width: Int = ...
let height: Int = ...
let pixelPtr = UnsafePointer<Pixel>(CFDataGetBytePtr(data))
let pixelBuf = UnsafeBufferPointer<Pixel>(start: pixelPtr, count:width*height)
答案 1 :(得分:1)
我猜对于Swift 3及之后版本,解决方案需要更新如下:
let pixelPtr0 = UnsafePointer<UInt8>(CFDataGetBytePtr(data))
let pixelPtr = UnsafeRawPointer(pixelPtr0)?.bindMemory(to: Pixel.self, capacity: 1)
let pixelBuf = UnsafeBufferPointer<Pixel>(start: pixelPtr, count:width*height)
对我有用。