【问题标题】:Convert between UIImage and Base64 string在 UIImage 和 Base64 字符串之间转换
【发布时间】:2021-09-13 20:09:29
【问题描述】:

有谁知道如何将UIImage 转换为Base64 字符串,然后将其反转?

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

NSData *imageData = UIImagePNGRepresentation(viewImage);

NSString *b64EncStr = [self encode: imageData];

NSString *base64String = [self encodeBase64:imageData];

【问题讨论】:

标签: ios swift uiimage base64 nsdata


【解决方案1】:

Base64 代码如下:

“数据:图像/ 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=="

使用 Swift5.0 代码如:

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

【讨论】:

    【解决方案2】:

    使用便捷初始化器进行解码 - Swift 5

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

    【讨论】:

      【解决方案3】:

      很高兴了解您是否按照 Tyler Sheaffer 所说的那样传递前缀。 但由于某种原因,您可能需要在 base64 字符串开头描述 mime 类型的前缀,所以我建议这段代码在编码之前传递一些选项(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
          }
      }
      

      【讨论】:

        【解决方案4】:

        斯威夫特 5

        编码

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

        解码

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

        注意:在 xcode 10.2 中测试

        斯威夫特 4

        编码

        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
        }
        

        解码

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

        注意:在 xcode 9.4.1 中测试

        【讨论】:

        • 感谢您对我的回答发表评论,请您为我的回答投票,这对我很有帮助。
        【解决方案5】:
        //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
        

        【讨论】:

          【解决方案6】:

          斯威夫特 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()
              }
          
          }
          

          【讨论】:

            【解决方案7】:

            Swift 5、Xcode 10。

             let imageData = UIImage(named:"imagename").pngData()?.base64EncodedString(options: .lineLength64Characters)
            
            print(imageData)

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              • 这不好。您不应该强制打开图像,因为如果无法从数据中获取图像,它会导致应用程序崩溃。你应该像这样解开最后一行“return UIImage(data: imageData) ?? UIImage()”
              【解决方案9】:

              斯威夫特 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)
                  }
              }
              

              【讨论】:

                【解决方案10】:

                斯威夫特 4.2 | Xcode 10

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

                【讨论】:

                  【解决方案11】:

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

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

                  【讨论】:

                  • 我也尝试了很多解决方案,这个解决方案可以节省我接下来的几个小时
                  • 我尝试了所有解决方案,最后你拯救了我的一天。
                  【解决方案12】:

                  斯威夫特

                  首先我们需要有图片的 NSData

                  //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 > 编码

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

                  Swift 2.0 > 解码

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

                  Swift 3.0 > 解码

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

                  编码

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

                  解码

                  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
                  

                  目标-C

                  iOS7 > 版本

                  你可以使用NSData'sbase64EncodedStringWithOptions

                  编码

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

                  解码

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

                  iOS 6.1 和

                  第一个选项:使用this 链接到encodedecode 图像

                  在您的project 中添加Base64 类。

                  编码

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

                  解码

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

                  另一个选项:将QSUtilities 用于encodingdecoding


                  【讨论】:

                  • @Safecase 我不是让你失望的人,但可能是双重职位是犯罪?
                  • 不是这样,但我想对这个问题给出正确的答案
                  • Base64 类永远休眠,即使在将图像质量设置为 0.001f 后,如果我使用它,我总是强制相当 xcode
                  • 重要提示:确保您的 base64 字符串不包含浏览器显示所需的前缀,例如data:image/jpeg;base64,
                  • @TylerSheaffer 我认为这是一条重要信息,应该包含在答案中。
                  【解决方案13】:

                  SWIFT 3.0、XCODE 8.0

                  将字符串替换为您的网址。而testImage是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
                  

                  希望对您有所帮助,谢谢。

                  【讨论】:

                    【解决方案14】:

                    Swift 3.0

                    图片转base64字符串

                    在操场上测试

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

                    【讨论】:

                      【解决方案15】:

                      Swift 3.0 和 Xcode 8.0

                      let imageData = UIImageJPEGRepresentation(imageView.image!, 1)
                      
                          let base64String = (imageData! as Data).base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
                          print(base64String)
                      

                      【讨论】:

                        【解决方案16】:

                        在 Swift 3.0 和 Xcode 8.0 中

                        编码:

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

                        解码:

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

                        【讨论】:

                          【解决方案17】:

                          在 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!
                          
                          }
                          

                          【讨论】:

                            【解决方案18】:

                            Swift 版本 - 为图像创建 base64

                            在我看来,在UIImagePNGRepresenatation() 的情况下隐式展开可选是不安全的,所以我建议使用如下扩展:

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

                            【讨论】:

                              【解决方案19】:

                              在 swift 2.0 中使用这个扩展(感谢 Jonas Franz)

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

                              【讨论】:

                                【解决方案20】:
                                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)
                                    }
                                }
                                

                                【讨论】:

                                  【解决方案21】:

                                  Swift 扩展:

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

                                  【讨论】:

                                  • 对于 Swift 2.2,.allZeros 没有编译。所以我使用了 return imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
                                  • 使用 Encoding64CharacterLineLength 而不是 allZero
                                  • 我正在使用 switft3,无法转换为发送到服务器:let imageData = UIImagePNGRepresentation(ImageView.image!); let strBase64:String = imageData!.base64EncodedString()
                                  • @Cmag 我知道你的评论已经有 2 年了,但你设法解决了吗?
                                  • @ZUNJAE 恐怕我不记得我是如何修复它的,无法再访问解决方案
                                  【解决方案22】:

                                  对于 iOS 7+,Objective-C,以下是从图像 URL 开始进行转换的方法:

                                  NSURL *url = [NSURL URLWithString:self.groove.thumbnailURL];
                                  
                                  UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
                                  
                                  NSString *base64String = [UIImagePNGRepresentation(image)
                                  base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
                                  

                                  【讨论】:

                                    【解决方案23】:

                                    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
                                    

                                    【讨论】:

                                      【解决方案24】:
                                      @implementation UIImage (Extended)
                                      
                                      - (NSString *)base64String {
                                          NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
                                          return [NSString stringWithUTF8String:[data bytes]];
                                      }
                                      
                                      @end
                                      

                                      【讨论】:

                                      • 简洁优雅。喜欢它!
                                      猜你喜欢
                                      • 2014-05-10
                                      • 2011-08-25
                                      • 2017-03-16
                                      • 1970-01-01
                                      • 2011-11-06
                                      • 2010-11-29
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多