Chuyển đổi giữa chuỗi UIImage và Base64


224

Có ai biết làm thế nào để chuyển đổi một UIImagechuỗi Base64, và sau đó đảo ngược nó không?

Tôi có mã dưới đây; hình ảnh gốc trước khi mã hóa là tốt, nhưng tôi chỉ nhận được một hình ảnh trống sau khi tôi mã hóa và giải mã nó.

NSData *imageData = UIImagePNGRepresentation(viewImage);

NSString *b64EncStr = [self encode: imageData];

NSString *base64String = [self encodeBase64:imageData];

Hãy thử điều này: github.com/l4u/NSData-Base64

Bất cứ ai cũng có thể trả lời cho câu hỏi này: stackoverflow.com/questions/39657434/ từ
user3011809

Câu trả lời:


575

Nhanh

Đầu tiên chúng ta cần phải có NSData của hình ảnh

//Use image name from bundle to create NSData
let image : UIImage = UIImage(named:"imageNameHere")!
//Now use image to create into NSData format
let imageData:NSData = UIImagePNGRepresentation(image)!

//OR next possibility

//Use image's path to create NSData
let url:NSURL = NSURL(string : "urlHere")!
//Now use image to create into NSData format
let imageData:NSData = NSData.init(contentsOfURL: url)!

Swift 2.0> Mã hóa

let strBase64:String = imageData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

Swift 2.0> Giải mã

let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!

Swift 3.0> Giải mã

let dataDecoded : Data = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters)!

Mã hóa :

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

Giải mã :

let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions(rawValue: 0))!
let decodedimage:UIImage = UIImage(data: dataDecoded)!
print(decodedimage)
yourImageView.image = decodedimage

Swift 3.0

let dataDecoded : Data = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters)!
let decodedimage = UIImage(data: dataDecoded)
yourImageView.image = decodedimage

Mục tiêu-C

phiên bản iOS7>

Bạn có thể dùng NSData's base64EncodedStringWithOptions

Mã hóa :

- (NSString *)encodeToBase64String:(UIImage *)image {
 return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}

Giải mã :

- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
  NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
  return [UIImage imageWithData:data];
}

phiên bản iOS 6.1 và <

Tùy chọn đầu tiên : Sử dụng liên kết này đến encodedecodehình ảnh

Thêm lớp Base64 trong của bạn project.

Mã hóa :

 NSData* data = UIImageJPEGRepresentation(yourImage, 1.0f);
 NSString *strEncoded = [Base64 encode:data];

Giải mã :

 NSData* data = [Base64 decode:strEncoded ];;
 image.image = [UIImage imageWithData:data];

Tùy chọn khác : Sử dụng QSUtilities cho encodingdecoding



1
@Safecase Tôi không phải là người đã bỏ phiếu cho bạn, nhưng có lẽ bài viết kép là vi phạm?
Tommy

1
Không phải vậy nhưng tôi muốn đưa ra câu trả lời đúng cho câu hỏi
Paresh Navadiya

2
Base64Lớp học sẽ ngủ mãi mãi, tôi luôn ép buộc khá xcode nếu tôi sử dụng điều này ngay cả sau khi làm cho chất lượng hình ảnh thành 0,001f
shebelaw

6
Quan trọng lưu ý: Hãy chắc chắn rằng chuỗi base64 của bạn không bao gồm tiền tố cần thiết trên một trình duyệt để hiển thị, ví dụdata:image/jpeg;base64,
Tyler Sheaffer

2
@TylerSheaffer Tôi nghĩ rằng đây là một thông điệp quan trọng, cần được đưa vào câu trả lời.
Vô tận

33

Phương pháp mở rộng Swift 4.2

extension UIImage {
    func toBase64() -> String? {
        guard let imageData = self.pngData() else { return nil }
        return imageData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters)
    }
}

XCode 9.1 và Swift 4.0

//
// Convert UIImage to a base64 representation
//
class func convertImageToBase64(image: UIImage) -> String {
    let imageData = UIImagePNGRepresentation(image)!
    return imageData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters)
}

//
// Convert a base64 representation to a UIImage
//
class func convertBase64ToImage(imageString: String) -> UIImage {
    let imageData = Data(base64Encoded: imageString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!
    return UIImage(data: imageData)!
}

19

SWift 3.0, XCODE 8.0

Thay thế Chuỗi bằng URL của bạn. và testImage là một lối thoát của ImageView

// Put Your Image URL
let url:NSURL = NSURL(string : "http://.jpg")!
// It Will turn Into Data
let imageData : NSData = NSData.init(contentsOf: url as URL)!
// Data Will Encode into Base64
let str64 = imageData.base64EncodedData(options: .lineLength64Characters)
// Now Base64 will Decode Here
let data: NSData = NSData(base64Encoded: str64 , options: .ignoreUnknownCharacters)!
// turn  Decoded String into Data
let dataImage = UIImage(data: data as Data)
// pass the data image to image View.:)
testImage.image = dataImage

Hy vọng nó sẽ giúp cảm ơn.


19

Swift 5

Mã hóa

func convertImageToBase64String (img: UIImage) -> String {
    return img.jpegData(compressionQuality: 1)?.base64EncodedString() ?? ""
}

Giải mã

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

Lưu ý: Đã thử nghiệm trong xcode 10.2

Swift 4

Mã hóa

func convertImageToBase64String (img: UIImage) -> String {
    let imageData:NSData = UIImageJPEGRepresentation(img, 0.50)! as NSData //UIImagePNGRepresentation(img)
    let imgString = imageData.base64EncodedString(options: .init(rawValue: 0))
    return imgString
}

Giải mã

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

Lưu ý: Đã thử nghiệm trong xcode 9.4.1


Cảm ơn bạn đã nhận xét về câu trả lời của tôi, Bạn có thể vui lòng bỏ phiếu cho câu trả lời của tôi, điều này rất hữu ích cho tôi.
Vivek

11

Swift iOS8

// prgm mark ---- 

// convert images into base64 and keep them into string

func convertImageToBase64(image: UIImage) -> String {

    var imageData = UIImagePNGRepresentation(image)
    let base64String = imageData.base64EncodedStringWithOptions(.allZeros)

    return base64String

}// end convertImageToBase64


// prgm mark ----

// convert images into base64 and keep them into string

func convertBase64ToImage(base64String: String) -> UIImage {

    let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0) )

    var decodedimage = UIImage(data: decodedData!)

    return decodedimage!

}// end convertBase64ToImage

8

Swift 3.0

Để chuyển đổi hình ảnh thành chuỗi base64

Thử nghiệm trong sân chơi

    var logo = UIImage(named: "image_logo")
    let imageData:Data =  UIImagePNGRepresentation(logo)
    let base64String = imageData.base64EncodedString()
    print(base64String)

7
@implementation UIImage (Extended)

- (NSString *)base64String {
    NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return [NSString stringWithUTF8String:[data bytes]];
}

@end

1
Đơn giản và thanh lịch. Yêu nó!
Myxtic

7

Trong swift 2.0, hãy sử dụng tiện ích mở rộng này (ghi có vào Jonas Franz)

extension UIImage{
  func toBase64() -> String{
    let imageData = UIImagePNGRepresentation(self)!
    return imageData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
  }
}

5

Trong Swift 3.0 và Xcode 8.0

Mã hóa:

let userImage:UIImage = UIImage(named: "Your-Image_name")!
let imageData:NSData = UIImagePNGRepresentation(userImage)! as NSData
let dataImage = imageData.base64EncodedString(options: .lineLength64Characters)

Giải mã:

let imageData = dataImage
let dataDecode:NSData = NSData(base64Encoded: imageData!, options:.ignoreUnknownCharacters)!
let avatarImage:UIImage = UIImage(data: dataDecode as Data)!
yourImageView.image = avatarImage

4

Tiện ích mở rộng:

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

Đối với Swift 2.2, .allZeros không được biên dịch. Vì vậy, tôi đã sử dụng return imageData.base64EncodingStringWithOptions (NSDataBase64EncodingOptions (rawValue: 0))
Carl Smith

Sử dụng Encoding64CharacterLineLpm thay vì allZero
Jonas Franz

1
tôi đang sử dụng switft3, không thể chuyển đổi để gửi đến máy chủ:let imageData = UIImagePNGRepresentation(ImageView.image!); let strBase64:String = imageData!.base64EncodedString()
Cmag

@Cmag Tôi biết bình luận của bạn đã 2 tuổi nhưng bạn đã sửa chưa?
Zun

@ZUNJAE tôi sợ tôi không nhớ tôi đã sửa nó như thế nào, không có quyền truy cập vào giải pháp nữa
Cmag

3

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)
    }
}

3

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()
    }

}

2

Phiên bản Swift - tạo base64 cho hình ảnh

Theo ý kiến ​​của tôi Hoàn UIImagePNGRepresenatation()toàn không bị ràng buộc Tùy chọn trong trường hợp không an toàn, vì vậy tôi khuyên bạn nên sử dụng tiện ích mở rộng như dưới đây:

extension UIImage {

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

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

Trong 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!

}

1

Tôi đã thử tất cả các giải pháp, không có giải pháp nào phù hợp với tôi (sử dụng Swift 4), đây là giải pháp hiệu quả với tôi, nếu bất kỳ ai trong tương lai phải đối mặt với cùng một vấn đề.

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

yourImage.image = decodedimage

Tôi cũng đã thử nhiều giải pháp, Giải pháp này giúp tôi tiết kiệm nhiều giờ tiếp theo
Ahmad

1

Swift 4.2 | Xcode 10

extension UIImage {

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


1
//convert Image to Base64 (Encoding)

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

print(strBase64)

// convert Base64 to Image (Decoding)

let dataDecoded:NSData = NSData(base64EncodedString: strBase64, options: NSDataBase64DecodingOptions(rawValue: 0))!

let decodedimage:UIImage = UIImage(data: dataDecoded)!

print(decodedimage)

yourImageView.image = decodedimage

0

Đối với iOS 7+, Objective-C, đây là cách thực hiện chuyển đổi bắt đầu bằng URL hình ảnh:

NSURL *url = [NSURL URLWithString:self.groove.thumbnailURL];

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

NSString *base64String = [UIImagePNGRepresentation(image)
base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

0

Swift 3.0 và Xcode 8.0

let imageData = UIImageJPEGRepresentation(imageView.image!, 1)

    let base64String = (imageData! as Data).base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    print(base64String)

0

Đối với mã Base64 như:

"Dữ liệu: image / jpg; base64, iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAAB9klEQVR42u2YQYorMQxEBbqWQFc36FoG / 6pyOpNZ / J20mGGaTiftF2hbLpWU2PnfYX / k55Jl5vhUVTu8luUdaCeFcydejjdwDUyQ5XV2JOcSZnkHZgiejusK51QGycrl2yIR1BwjjKivSFz8YC7fY91GKIj6PL5pp4 / wWL54t3MHt / AjFxoJwmkYwosbh6 / UEHE817hvi / vGex8gEkTdVRo1 / 55BM7kjUIgpoMW1DxB6kD + GtCX4PUFws40OwcUm0 / lRYjOB3pG9YcguBFQuO0ISJ9UIrUP5CKy / MriXHDkETYmLDax1 + RkgWBglQgUyq6T / HCAHBq7iJHd9KWWAlIKoGpiLc6HNDhDkETNYwqeVhym72snKKxA6BJL4UPM5QPYtgGwZeNZ5O0UvgSb0VGdcmVfJCQwQrM + pRiGnYJ497SUlv2NOYfOCX3qU2Equ7W3JAslsN7oDBDWWojcZq + KbEwQRdRYl1wD3ML52rpGc6w24qCXaKh4DRHWJbUPemqtEGyBMKC4Q / QmWiDWzRxkgO1UtSLh3svMaILeDpEGwrwvZ4Bkg9LynK1Y1LJWQdqKGnm3K7VTCz7vS9hIuUyYRd / xKcYRIHGqAViisQ4S / Uozmqo41Pn6bNRI1xS / fk2fMEKpDZYkpjP6B1T0HyN9 / Nb + M / AORXDdE4Lb / mQAAAABJRU5ErkJggg == "

Sử dụng mã Swift5.0:

func qrcodeImage(_ base64: String) -> UIImage? {
    if let url = URL(string: base64) {
        if let data = try? Data(contentsOf: url) {
            return UIImage(data: data)
        }
    }
    return nil
}

0

Rất tốt để hiểu bạn có vượt qua tiền tố như Tyler Sheaffer đã nói không. Nhưng vì một số lý do, bạn có thể cần tiền tố này mô tả loại mime ở đầu chuỗi base64, vì vậy tôi đề nghị đoạn mã này để vượt qua một số tùy chọn trước khi mã hóa ( 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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.