在Swift中将字节数组转换为UIImage
我想在我的项目中将字节数组转换为UIImage
。
为此我在这里找到了一些东西。
之后,我尝试在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
屏幕截图显示如下。
请帮忙解决这个问题。
如果您使用的是引用的示例数据,则这些值不是UInt
– 它们是对Int
s进行签名的。 将负数传递给UInt8()
确实似乎导致运行时崩溃 – 我原以为它应该返回一个可选项。 答案是使用bitPattern:
signature使用初始化程序,如下面的Playground示例所示:
let o = Int8("-127") print(o.dynamicType) // Optional() // 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 }
因此你的function应该是
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!!! }