我有以下代码来创建表,以使用Swift加速功能在iOS中对图像进行采样
当我将内存反弹到UInt16时(表创建期望该类型是原始类型),这是一个致命错误。
var arr = Array<Float>(repeating: 0, count: 163840)
arr.withUnsafeBufferPointer{
arr_pointer in do {
arr_pointer.withMemoryRebound(to: UInt16.self){ // This causes a FATAL ERROR
arr_r_pointer in do {
let table = vImageMultidimensionalTable_Create( arr_r_pointer.baseAddress!,
3, 3, dims_r_pointer.baseAddress!, kvImageMDTableHint_Float,
vImage_Flags(kvImageNoFlags), nil )
vImageMultiDimensionalInterpolatedLookupTable_PlanarF( &srcBuffer,
&destBuffer,nil,table!,
kvImageFullInterpolation,
vImage_Flags(kvImageNoFlags))
}
}
}
}
有人可以在这里指出我的错误吗?
答案 0 :(得分:1)
您应该已经阅读Note
的{{1}}函数:
注意
仅使用此方法将缓冲区的内存重新绑定为与当前绑定的
withMemoryRebound
类型相同的大小和跨度的类型。至 将内存区域绑定到不同大小的类型,转换 将该缓冲区转换为原始缓冲区,然后使用Element
方法。
bindMemory(to:)
的大小为 32 位,Float
的大小为 16 位,因此它们的大小不同,不能相同反弹。
因此,您应该执行以下操作:
UInt16
还要注意,初始数组中的每个arr.withUnsafeBufferPointer { pointer in
let raw = UnsafeRawBufferPointer(pointer)
let uints = raw.bindMemory(to: UInt16.self)
// use buffer pointer to `UInt16`s here
}
都将以这种方式分成两个Float
。我不知道那不是你所需要的。
答案 1 :(得分:0)
您的原始数组arr
是Float
s的数组
var arr = Array<Float>(repeating: 0, count: 163840)
但是您正在尝试将指针绑定到UInt16
arr_pointer.withMemoryRebound(to: UInt16.self)