如何在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]; 
  1. 将Base64解码为原始二进制文件。 你自己在这里 你可能会发现NSString cStringUsingEncoding:有用。
  2. 使用dataWithBytes:length:创buildNSData实例dataWithBytes:length:
  3. 使用[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; } }