假设我有一个UIImage
实例,我想将其转换为数据URI并注入UIWebView.
我知道我可以使用NSData
/ PNGRepresentation
方法将UIImage转换为PNG / JPEG JPEGRepresentation
。但是,我如何确保转换是base64?然后如何创建一个包含实际URI和标题的字符串?
答案 0 :(得分:9)
这是我用来做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,但有第三方库可以做同样的事情。
答案 1 :(得分:1)
从中创建NSData不会在base 64中编码.NSData是二进制数据(字节,范围在0-255之间); base 64编码是一种文本编码,它使用ASCII的子集来表示字节值。你要做的是创建NSData,然后使用转换例程将其编码为base 64字符串;这样做有很多参考。获得base64字符串后,请使用标准方法将图像数据插入HTML。
答案 2 :(得分:1)
这里是@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())"
}
}
答案 3 :(得分:0)
这是@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: []) ?? "")"
}
}