【问题标题】:Converting a UIImage into a data URI将 UIImage 转换为数据 URI
【发布时间】:2013-06-19 03:11:45
【问题描述】:

假设我有一个UIImage 实例,我想将其转换为数据URI 并注入UIWebView.

我知道我可以使用 PNGRepresentation/JPEGRepresentation 方法将 UIImage 转换为 PNG/JPEG NSData。但是那我如何确保转换是base64?然后如何创建一个包含实际 URI 和标头的字符串?

【问题讨论】:

    标签: ios ios6 uiimage uikit data-url


    【解决方案1】:

    这是 UIImage 上的一个类别,我就是这样做的:

    - (BOOL)hasAlpha
    {
        CGImageAlphaInfo alpha = CGImageGetAlphaInfo(self.CGImage);
        return (alpha == kCGImageAlphaFirst ||
                alpha == kCGImageAlphaLast ||
                alpha == kCGImageAlphaPremultipliedFirst ||
                alpha == kCGImageAlphaPremultipliedLast);
    }
    
    - (NSString *)dataURL
    {
        NSData *imageData = nil;
        NSString *mimeType = nil;
    
        if (self.hasAlpha) {
            imageData = UIImagePNGRepresentation(self);
            mimeType = @"image/png";
        } else {
            imageData = UIImageJPEGRepresentation(self, 1.0);
            mimeType = @"image/jpeg";
        }
    
        return [NSString stringWithFormat:@"data:%@;base64,%@", mimeType, [imageData base64EncodedStringWithOptions:0]];
    }
    

    这需要 iOS 7 将数据编码为 base64,但也有第三方库可以做同样的事情。

    【讨论】:

      【解决方案2】:

      用它创建 NSData 不会在 base 64 中编码。 NSData 二进制数据(字节,在 0-255 范围内); base 64 编码是一种文本编码,它使用 ASCII 的子集来表示字节值。您要做的是创建 NSData,然后使用转换例程将其编码为 base 64 字符串;有很多这样做的参考资料。获得 base64 字符串后,使用标准方法将图像数据插入 HTML。

      【讨论】:

        【解决方案3】:

        这是对@David Beck 答案的改编,使用 Swift 4 / XCode 10.1 / iOS 12:

        extension UIImage {
            func hasAlpha() -> Bool {
                let noAlphaCases: [CGImageAlphaInfo] = [.none, .noneSkipLast, .noneSkipFirst]
                if let alphaInfo = cgImage?.alphaInfo {
                    return !noAlphaCases.contains(alphaInfo)
                } else {
                    return false
                }
            }
        
            func dataURI() -> String? {
                var mimeType: String = ""
                var imageData: Data
                if hasAlpha(), let png = pngData() {
                    imageData = png
                    mimeType = "image/png"
                } else if let jpg = jpegData(compressionQuality: 1.0) {
                    imageData = jpg
                    mimeType = "image/jpeg"
                } else {
                    return nil
                }
        
                return "data:\(mimeType);base64,\(imageData.base64EncodedString())"
            }
        }
        

        【讨论】:

          【解决方案4】:

          如果有人需要,这是@David Beck 的答案的 Swift 5 版本:

          extension UIImage {
          
          func hasAlpha() -> Bool {
              guard let cgImage = cgImage else {
                  return false
              }
              let alpha = cgImage.alphaInfo
              return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
          }
          
          func dataURL() -> String? {
              var imageData: Data? = nil
              var mimeType: String? = nil
          
              if hasAlpha() {
                  imageData = self.pngData()
                  mimeType = "image/png"
              } else {
                  imageData = self.jpegData(compressionQuality: 1.0)
                  mimeType = "image/jpeg"
              }
          
              return "data:\(mimeType ?? "");base64,\(imageData?.base64EncodedString(options: []) ?? "")"
          }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-19
            • 2018-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-05
            • 1970-01-01
            相关资源
            最近更新 更多