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

Posted

技术标签:

【中文标题】在 Swift 中将字节数组转换为 UIImage【英文标题】:convert byte array to UIImage in Swift 【发布时间】:2016-07-11 13:53:59 【问题描述】:

我想在我的项目中将字节数组转换为UIImage。 为此,我发现了一些东西 here. 之后我尝试快速转换该代码但失败了。

这是我的 swift 版本的代码。

func convierteImagen(cadenaImagen: NSMutableString) -> UIImage 
        var strings: [AnyObject] = cadenaImagen.componentsSeparatedByString(",")
        let c: UInt = UInt(strings.count)
        var bytes = [UInt8]()
        for (var i = 0; i < Int(c); i += 1) 
            let str: String = strings[i] as! String
            let byte: Int = Int(str)!
            bytes.append(UInt8(byte))
//            bytes[i] = UInt8(byte)
        
        let datos: NSData = NSData(bytes: bytes as [UInt8], length: Int(c))
        let image: UIImage = UIImage(data: datos)!
        return image
    

但我遇到了错误:

EXC_BAD_INSTRUCTION

如下图所示。

请帮忙解决这个问题。

【问题讨论】:

【参考方案1】:

如果您使用引用的示例数据,则这些值不是UInts - 它们是签名Ints。将负数传递给UInt8() 似乎确实会导致运行时崩溃——我原以为它应该返回一个可选值。答案是使用带有bitPattern: 签名的初始化程序,如下面的 Playground 示例所示:

let o = Int8("-127")
print(o.dynamicType) // Optional(<Int8>)
// It's optional, so we need to unwrap it...
if let x = o 
    print(x) // -127, as expected
    //let b = UInt8(x) // Run time crash
    let b = UInt8(bitPattern: x) // 129, as it should be

因此你的函数应该是

func convierteImagen(cadenaImagen: String) -> UIImage? 
    var strings = cadenaImagen.componentsSeparatedByString(",")
    var bytes = [UInt8]()
    for i in 0..< strings.count 
        if let signedByte = Int8(strings[i]) 
            bytes.append(UInt8(bitPattern: signedByte))
         else 
            // Do something with this error condition
        
    
    let datos: NSData = NSData(bytes: bytes, length: bytes.count)
    return UIImage(data: datos) // Note it's optional. Don't force unwrap!!!

【讨论】:

感谢您的回复。它真的帮助了我。我刚刚将我的代码从 UInt8 更改为 Int8 并且它有效。我不能使用 UInt8 因为我已经在我的数组中签名了 Int。

以上是关于在 Swift 中将字节数组转换为 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

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

在for循环中将PFFile数组转换为UIImage返回空数组Swift

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

在swift 3中将字节数组转换为PDF

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

试图在 Swift 5.1 中将 UIImage 转换为 PFFileObject