将UIImage转换为数据URI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将UIImage转换为数据URI相关的知识,希望对你有一定的参考价值。

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

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

答案

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

另一答案

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

另一答案

这是使用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())"
    }
}

以上是关于将UIImage转换为数据URI的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 转换为 NSData 并在 Swift 中转换回 UIImage?

将UIImage转换为NSData并在Swift中转换回UIImage?

如何快速将 PFFile 转换为 UIImage?

将 java 应用程序转换为 restful uri

将UIImage转换为NSData并返回UIImage

将UIVIew转换为UIImage而不显示/显示UIView