无法在 iOS swift 中将 base64string 解码为 uiimage 但在 android 中工作正常

Unable to decode base64string to uiimage in iOS swift but working fine in android

我有这段代码可以在 iOS 和 Android 应用程序上将 UIImage 转换为 base64EncodedString 并从 base64EncodedString 转换回 UIImage .

问题是当我将 UIImage 转换为 base64EncodedString 并发送到我的 android 设备时,它起作用了, 此外,当我从 android 设备接收到 base64EncodedString 到 IOS 时,此函数 imageFromBase64 将毫无问题地将其解码为 UIImage。 但是当在 IOS 函数中将 UIImage 转换为 base64EncodedString 并尝试使用此函数 imageFromBase64 在 IOS 中对其进行解码时,它将 return 为零。

我有下面的代码将图像转换为 base64EncodedString

if let image = info[.originalImage] as? UIImage {
    let thumb1 = image.resized(withPercentage: 0.3)
    if let imageData = thumb1?.jpeg(.medium) {
        let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
        tryEmitMessage(message: strBase64)
    }
}

我的 android 示例将位图转换为 base64EncodedString

public static byte[] bitmapToByte(Bitmap bitmap){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    return stream.toByteArray();
}
byte[] bm = BitmapUtils.bitmapToByte(bitmap_image);
String strBase64 = Base64.encodeToString(bm, Base64.NO_WRAP);

Bellow 函数用于将 base64EncodedString 解码为 UIImage

func imageFromBase64 (base64:String) -> UIImage {
    let imageData = Data.init(base64Encoded: base64, options: .init(rawValue: 0))
    let image = UIImage(data: imageData!)
    return image!
}

let message = "base64 string"
dataView.uiimage_image = imageFromBase64(base64: message)

我的 android 示例将 base64EncodedString 转换为位图

byte[] b = Base64.decode("base64 string", Base64.DEFAULT);
Bitmap bmp = BitmapFactory.decodeByteArray(b,0,b.length);

请问如何在 iOS swift 中编码和解码 base64 图像?

你做到了:

let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)

let imageData = Data(base64Encoded: base64, options: .init(rawValue: 0))

所以你添加了一个编码选项,而不是解码选项?那么“默认”解码是否有效?无需指定设置了特定选项?

让我们看看lineLength64Characters的文档:

Set the maximum line length to 64 characters, after which a line ending is inserted.

让我们看看可用的文档 Data.Base64DecodingOptions, especially .ignoreUnknownCharacters:

Modify the decoding algorithm so that it ignores unknown non-Base-64 bytes, including line ending characters.

看到了吗?

在解码时使用 .ignoreUnknownCharacters 而不是 .init(rawValue:0)(顺便说一句,可以用 [] 简化,或者干脆不放置参数,因为 [] 是它的默认值值)。