Mengonversi Byte Array ke UIImage

Saya memiliki array byte yang disimpan di database Postgres saya (tipe bidang bytea).

API mengembalikannya kepada saya seperti:

iVBORw0KGgoAAAANSUhEUgAAAMEAAADLCAYAAADX2ff6AAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGAqSSwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxK8/x506a1fP4WNq+ZclYlOrj1gQF3SmpxMgMDIweQnZxSnJwLZOcA2TrJBUUlQPYMIFu3vKQAxD4BZIsUAR0IZN8BsdMh7A8gdhKYzcQCVhMS5AxkSwDZAkkQtgaInQ5hW4DYyRmJKUC2B8guiBvAgNPDRcHcwFLXkYC7SQa5OaUwO0ChxZOaFxoMcgcQyzB4MLgwKDCYMxgwWDLoMjiWpFaUgBQ65xdUFmWmZ5QoOAJDNlXBOT+3oLQktUhHwTMvWU9HwcjA0ACkDhRnEKM/B4FNZxQ7jxDLX8jAYKnMwMDcgxBLmsbAsH0PA4PEKYSYyjwGBn5rBoZt5woSixLhDmf8xkKIX5xmbARh8zgxMLDe+///sxoDA/skBoa/E////73o//+/i4H2A+PsQA4AJHdp4IxrEg8AAAGdaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE5MzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yMDM8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K0eU+QgAAA+RJREFUeAHt0wENACAMBDFA4/xbgQQb1zlY87dn5i5HICxwwr97ncAXEIEh5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBUSQnwAAEdhAXkAE+QkAEIEN5AVEkJ8AABHYQF5ABPkJABCBDeQFRJCfAAAR2EBeQAT5CQAQgQ3kBR7HxwORQVNBhAAAAABJRU5ErkJggg==

Saya melihat bahwa bidang database berisi:

\211PNG\015\012\032\012\000\000\000\015IHDR\000\000\000\301\000\000\000\313\010\006\000\000\000\327\331\367\372\000\000\001|iCCPICC Profile\000\000(\221c``*I,(\310aa``\310\315+)\012rwR\210\210\214R`\277\303\300\315\300\303 \304`\305 \236\230\\\\\340\030\020\340\303\200\023|\273\306\300\010\242/\353\202\314J\363\374y\323\246\265|\376\0266\257\231rV%:\270\365\201\001wJjq2\003\003#\007\220\235\234R\234\234\013d\347\000\331:\311\005E%@\366\014 [\267\274\244\000\304>\001d\213\024\001\035\010d\337\001\261\323!\354\017 v\022\230\315\304\002V\023\022\344\014dK\000\331\002I\020\266\006\210\235\016a[\200\330\311\031\211)@\266\007\310.\210\033\300\200\323\303E\301\334\300R\327\221\200\273I\006\2719\2450;@\241\305\223\232\027\032\014r\007\020\3130x0\2700(0\2303\0300X2\35028\226\244V\224\200\024:\347\027T\026e\246g\224(8\002C6U\3019?\267\240\264$\265HG\3013/YOG\301\310\300\320\000\244\016\024g\020\243?\007\201Mg\024;\217\020\313_\310\300`\251\314\300\300\334\203\020K\232\306\300\260}\017\003\203\304)\204\230\312<\006\006~k\006\206m\347\012\022\213\022\341\016g\374\306B\210_\234fl\004a\363810\260\336\373\377\377\263\032\003\003\373$\006\206\277\023\377\377\377\275\350\377\377\277\213\201\366\003\343\354@\016\000$wi\340\214k\022\017\000\000\001\235iTXtXML:com.adobe.xmp\000\000\000\000\000<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">\012   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\012      <rdf:Description rdf:about=""\012            xmlns:exif="http://ns.adobe.com/exif/1.0/">\012         <exif:PixelXDimension>193</exif:PixelXDimension>\012         <exif:PixelYDimension>203</exif:PixelYDimension>\012      </rdf:Description>\012   </rdf:RDF>\012</x:xmpmeta>\012\321\345>B\000\000\003\344IDATx\001\355\323\001\015\000 \014\0041@\343\374[\201\004\033\3279X\363\267g\346.G ,p\302\277{\235\300\027\020\201!\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005D\220\237\000\000\021\330@^@\004\371\011\000\020\201\015\344\005\036\307\307\003\221ASA\204\000\000\000\000IEND\256B`\202

Itu harus berupa gambar yang direpresentasikan dalam array byte.

Saya ingin mengurai array byte ini kembali ke UIImage menggunakan Swift. Untuk itu saya memiliki fungsi berikut:

func convertImage(image: String) -> UIImage? {
    var strings = image.components(separatedBy: ",")
    var bytes = [UInt8]()

    for i in 0 ... strings.count-1 {
        if let signedByte = Int8(strings[i]) {
            bytes.append(UInt8(bitPattern: signedByte))
        } else {
            print("ERROR")
            // Do something with this error condition
        }
    }
    let datos: NSData = NSData(bytes: bytes, length: bytes.count)
    return UIImage(data: datos as Data) // Note it's optional. Don't force unwrap!!!
}

Tampaknya fungsi ini diulangi tetapi "ERROR" dicetak di bagian akhir. Namun saya tidak pernah memiliki UIImage.

Apa yang saya lakukan salah?


person Rutger Huijsmans    schedule 06.09.2017    source sumber
comment
Byte tersebut dikodekan dalam base64, mungkin agar API Anda dapat mengirimkannya sebagai teks (bukan data biner). Anda perlu mengonversinya kembali ke biner (Google caranya) dan kemudian Anda memiliki instance Data/NSData yang dapat digunakan untuk menginisialisasi UIImage.   -  person Nicolas Miari    schedule 06.09.2017


Jawaban (2)


iVBORw0KGgoAAAANSUhEUgAAA... mewakili base64 string yang dikodekan. Jadi Anda hanya perlu mengubahnya menjadi data menggunakan metode

let data = Data(base64Encoded: "iVBORw0KGgoAAAANSUhEUgAAA...")
let image = UIImage(data: data)

Semoga ini bisa membantu Anda

person Ihar Katkavets    schedule 06.09.2017

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
}

Oleh karena itu fungsi Anda seharusnya demikian

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!!! 
}
person Bikramjit Singh    schedule 06.09.2017