5

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

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

4

4 回答 4

10

这是我用来执行此操作的 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,但也有第三方库可以做同样的事情。

于 2014-08-26T22:39:21.627 回答
1

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

于 2013-06-19T04:32:22.043 回答
1

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

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())"
    }
}
于 2019-04-25T21:43:10.650 回答
1

如果有人需要,这是@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: []) ?? "")"
}

}

于 2019-08-01T14:14:32.973 回答