1

我有以下代码来创建一个表格,用于使用 Swift 加速功能在 iOS 中对图像进行采样

当我将内存反弹到 UInt16 时,表创建期望来自 Int 的原始类型,我得到一个致命错误。

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))
             }
        }
    }
}

谁能在这里指出我的错误?

4

2 回答 2

1

您应该阅读Note功能withMemoryRebound

笔记

仅使用此方法将缓冲区的内存重新绑定到与当前绑定类型具有相同大小和跨度的Element类型。要将内存区域绑定到不同大小的类型,请将缓冲区转换为原始缓冲区并使用该bindMemory(to:)方法。

大小Float32位,大小UInt1616位,因此它们的大小不同,无法反弹。

所以你应该做这样的事情:

arr.withUnsafeBufferPointer { pointer in
    let raw = UnsafeRawBufferPointer(pointer)
    let uints = raw.bindMemory(to: UInt16.self)
    // use buffer pointer to `UInt16`s here
}

但还要注意,初始数组中的每个都Float将以UInt16这种方式分成两部分。我不知道这是否是你需要的。

于 2018-08-30T09:10:13.460 回答
0

您的原始数组arr是一个Floats数组

var arr = Array<Float>(repeating: 0, count: 163840)

但你正试图将指针绑定到UInt16

arr_pointer.withMemoryRebound(to: UInt16.self)
于 2018-08-29T16:48:56.177 回答