如何在UIImageView中显示base64图像?
我有这个Base64 gif图像:
R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7
现在我想在我的iPhone应用程序中显示这个Base64string。
我可以通过使用WebView来实现这个工作:
aUIWebView.scalesPageToFit = NO; aUIWebView.opaque = NO; aUIWebView.backgroundColor = [UIColor clearColor]; [aUIWebView loadHTMLString: @"<html><body style=""background-color: transparent""><img src=""data:image/png;base64,R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7"" /></body></html>" baseURL:nil];
是否有可能通过使用UIImageView做同样的事情?
你不必编码。 简单地做一个NSUrl,它知道“data:” – url。
NSURL *url = [NSURL URLWithString:base64String]; NSData *imageData = [NSData dataWithContentsOfURL:url]; UIImage *ret = [UIImage imageWithData:imageData];
正如在评论中提到的,你必须确保你的数据是用data:image/png;base64,
否则你的base64数据是无用的。
这是一个非常古老的问题,但是从iOS7开始,有一个新的,更简单的方法来完成这个任务,因此我在这里编写它,以便将来的读者可以使用它。
NSData* data = [[NSData alloc] initWithBase64EncodedString:base64String options:0]; UIImage* image = [UIImage imageWithData:data];
很容易使用,并不会达到URL的2048字节大小的限制。
此代码将显示一个base64编码的string作为图片:
NSString *str = @"data:image/jpg;base64,"; str = [str stringByAppendingString:restauInfo.picture]; NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:str]];
restauInfo.picture是一个包含base64编码JPG的NSString
在我的情况下,来自“restauInfo.picture”的值来自数据库
你可以做如下的事情:
(UIImage *)decodeBase64ToImage:(NSString *)strEncodeData { NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters]; return [UIImage imageWithData:data]; }
然后像这样调用它:
UIImage *image = [self decodeBase64ToImage:dataString];
- 将Base64解码为原始二进制文件。 你自己在这里 你可能会发现
NSString
cStringUsingEncoding:
有用。 - 使用
dataWithBytes:length:
创buildNSData
实例dataWithBytes:length:
- 使用
[UIImage imageWithData:]
加载它。
谢谢你
我可以使用google: Base64.mfind一个Base64脚本
所以我修改了一下,可以得到一个工作testing代码:
NSString * base64img = @"R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7"; base64Data = [base64img dataUsingEncoding:NSASCIIStringEncoding]; base64Bytes = [base64Data bytes]; mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; lentext = [base64Data length]; while( YES ) { if( ixtext >= lentext ) break; ch = base64Bytes[ixtext++]; flignore = NO; if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A'; else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26; else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52; else if( ch == '+' ) ch = 62; else if( ch == '=' ) flendtext = YES; else if( ch == '/' ) ch = 63; else flignore = YES; if( ! flignore ) { short ctcharsinbuf = 3; BOOL flbreak = NO; if( flendtext ) { if( ! ixinbuf ) break; if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1; else ctcharsinbuf = 2; ixinbuf = 3; flbreak = YES; } inbuf [ixinbuf++] = ch; if( ixinbuf == 4 ) { ixinbuf = 0; outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 ); outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 ); outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F ); for( i = 0; i < ctcharsinbuf; i++ ) [mutableData appendBytes:&outbuf[i] length:1]; } if( flbreak ) break; } } //Finally I can access my image data: aUIImageView.image = [UIImage imageWithData: [NSData dataWithData:mutableData]];
以防万一任何人正在寻找Swift代码来完成这个(基于Jonathan M提供的Objective-C答案),这里是:
var data = NSData (base64EncodedString: base64String, options: NSDataBase64DecodingOptions(0)) var image = UIImage(data: data!)
Objective-C的
NSString *plainString = @"foo";
编码
NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64String = [plainData base64EncodedStringWithOptions:0]; NSLog(@"%@", base64String);
解码
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0]; NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; NSLog(@"%@", decodedString);
选项
NSURL *URL = [NSURL URLWithString: [NSString stringWithFormat:@"data:application/octet-stream;base64,%@", base64String]]; return [NSData dataWithContentsOfURL:URL];
迅速
let plainString = "foo"
编码
let plainData = (plainString as NSString).dataUsingEncoding(NSUTF8StringEncoding) let base64String = plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!) println(base64String)
解码
let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.fromRaw(0)!) let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) println(decodedString) // foo
在我的情况下,@Masche提出了一个解决scheme。 正如我在Swift 2.0中所需要的那样:
let url = NSURL(string: imageString) let data = NSData.init(contentsOfURL: url!) let image = UIImage(data: imageData)
用于下载带有base64图像string的文本文件的代码片段,然后保存/读取文件,最后创build一个图像在视图中显示
如果您需要将图像解码为Base64,请单击此处
NSString *downloadUrl = "http://www.server.com/file.txt"; // NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: downloadUrl]]; // // DOWNLOAD THE FILE // [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error) { NSLog(@"Download Error:%@",error.description); } if (data) { [data writeToFile:filePath atomically:YES]; // // PROCESS BASE 64 STRING // NSString * fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; // // PROCESS BASE 64 STRING // NSString *base64String = fileContents; NSURL *url = [NSURL URLWithString:base64String]; NSData *imageData = [NSData dataWithContentsOfURL:url]; // // CREATE IMAGE // UIImage *ret = [UIImage imageWithData:imageData]; self.myImage.image = ret; } }