在UIImage和Base64字符串之间进行转换

271

有人知道如何将 UIImage 转换为 Base64 字符串,然后再反转回来吗?

我有以下代码;编码前的原始图像很好,但编码和解码后我只得到了一张空白图像。

NSData *imageData = UIImagePNGRepresentation(viewImage);

NSString *b64EncStr = [self encode: imageData];

NSString *base64String = [self encodeBase64:imageData];

试试这个:https://github.com/l4u/NSData-Base64/ - user529758
有人能回答这个问题吗:http://stackoverflow.com/questions/39657434/issue-in-coverting-zlib-compressed-base-64-string-to-uiimage/39659390?noredirect=1#comment66621861_39659390 - user3011809
24个回答

4

Swift 4

enum ImageFormat {
    case png
    case jpeg(CGFloat)
}

extension UIImage {
    func base64(format: ImageFormat) -> String? {
        var imageData: Data?

        switch format {
        case .png: imageData = UIImagePNGRepresentation(self)
        case .jpeg(let compression): imageData = UIImageJPEGRepresentation(self, compression)
        }

        return imageData?.base64EncodedString()
    }
}

extension String {
    func imageFromBase64() -> UIImage? {
        guard let data = Data(base64Encoded: self) else { return nil }

        return UIImage(data: data)
    }
}

4

Swift扩展:

extension UIImage{
     func toBase64() -> String{
          var imageData = UIImagePNGRepresentation(self)
          return imageData.base64EncodedStringWithOptions(.allZeros)
     }
}

对于Swift 2.2,.allZeros无法编译。因此我使用了return imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))。 - Carl Smith
请使用Encoding64CharacterLineLength代替allZero。 - Jonas Franz
1
我正在使用Swift3,但无法将以下代码转换为可发送到服务器的格式: let imageData = UIImagePNGRepresentation(ImageView.image!); let strBase64:String = imageData!.base64EncodedString() - Cmag
@Cmag,我知道你的评论已经两年了,但是你最终解决了这个问题吗? - Zun
@ZUNJAE,很抱歉我不记得我是如何修复它的,也无法再访问该解决方案了。 - Cmag

4

Swift 5.

class ImageConverter {

    func base64ToImage(_ base64String: String) -> UIImage? {
        guard let imageData = Data(base64Encoded: base64String) else { return nil }
        return UIImage(data: imageData)
    }

    func imageToBase64(_ image: UIImage) -> String? {
        return image.jpegData(compressionQuality: 1)?.base64EncodedString()
    }

}

3

我尝试了所有的解决方案,但都没有成功(使用Swift 4),这是对我有用的解决方案,如果将来有人遇到同样的问题。

let temp = base64String.components(separatedBy: ",")
let dataDecoded : Data = Data(base64Encoded: temp[1], options: 
 .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)

yourImage.image = decodedimage

我也尝试了很多解决方案,这个解决方案为我节省了许多时间。 - Ahmad
我尝试了所有的解决方案,最终你救了我的一天。 - Nihas Nizar

2

了解 Tyler Sheaffer 所说的前缀非常重要。 但是由于某些原因,您可能需要在 base64 字符串的开头添加描述 mime-type 的前缀,因此我建议在编码之前传递一些选项(Swift 5):

extension UIImage {

    enum Format: String {
        case png = "png"
        case jpeg = "jpeg"
    }

    func toBase64(type: Format = .jpeg, quality: CGFloat = 1, addMimePrefix: Bool = false) -> String? {
        let imageData: Data?
        switch type {
        case .jpeg: imageData = jpegData(compressionQuality: quality)
        case .png:  imageData = pngData()
        }
        guard let data = imageData else { return nil }

        let base64 = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters)

        var result = base64
        if addMimePrefix {
            let prefix = "data:image/\(type.rawValue);base64,"
            result = prefix + base64
        }
        return result
    }
}

2

Swift版本 - 为图像创建base64

在我的看法中,在UIImagePNGRepresentation()中使用隐式解包可选项是不安全的,所以我建议使用以下扩展:

extension UIImage {

    func toBase64() -> String? {
        let imageData = UIImagePNGRepresentation(self)
        return imageData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
    }
}

2

使用方便的初始化器解码 - Swift 5

extension UIImage {
    convenience init?(base64String: String) {
        guard let data = Data(base64Encoded: base64String) else { return nil }
        self.init(data: data)
    }
} 

1
See my class -  AppExtension.swift


// MARK: - UIImage (Base64 Encoding)

public enum ImageFormat {
    case PNG
    case JPEG(CGFloat)
}

extension UIImage {

    public func base64(format: ImageFormat) -> String {
        var imageData: NSData
        switch format {
        case .PNG: imageData = UIImagePNGRepresentation(self)
        case .JPEG(let compression): imageData = UIImageJPEGRepresentation(self, compression)
        }
        return imageData.base64EncodedStringWithOptions(.allZeros)
    }
}

1

Swift 4.2 | Xcode 10

extension UIImage {

    /// EZSE: Returns base64 string
    public var base64: String {
        return self.jpegData(compressionQuality: 1.0)!.base64EncodedString()
    }
}

1
在Swift 3.0中
func decodeBase64(toImage strEncodeData: String) -> UIImage {

    let dataDecoded  = NSData(base64Encoded: strEncodeData, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!
    let image = UIImage(data: dataDecoded as Data)
    return image!

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接