在 Swift 中将字节数组转换为 UIImage
convert byte array to UIImage in Swift
我想在我的项目中将字节数组转换为 UIImage
。
为此,我找到了一些东西 here.
之后我尝试在 swift 中转换该代码但失败了。
这是我的 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
s - 它们是带符号的 Int
s。将负数传递给 UInt8()
似乎确实会导致运行时崩溃——我本以为它应该 return 是一个可选的。答案是使用带有 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!!!
}
我想在我的项目中将字节数组转换为 UIImage
。
为此,我找到了一些东西 here.
之后我尝试在 swift 中转换该代码但失败了。
这是我的 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
s - 它们是带符号的 Int
s。将负数传递给 UInt8()
似乎确实会导致运行时崩溃——我本以为它应该 return 是一个可选的。答案是使用带有 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!!!
}