52

我得到了这个 Base64 gif 图像:

R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7

现在我想在我的 iPhone 应用程序中显示这个 Base64 字符串。

我可以通过使用 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 来做同样的事情?

4

11 回答 11

132

您不必对其进行编码。只需制作一个 NSUrl,它就知道“data:”-url。

NSURL *url = [NSURL URLWithString:base64String];    
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *ret = [UIImage imageWithData:imageData];

正如评论中提到的,您必须确保在数据前面加上,data:image/png;base64,否则您的 base64 数据将毫无用处。

于 2009-09-04T11:33:05.673 回答
70

非常老的问题,但从 iOS7 开始,有一种新的、更简单的方法可以做到这一点,因此我在这里写它,以便未来的读者可以使用它。

NSData* data = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
UIImage* image = [UIImage imageWithData:data];

非常易于使用,并且不会达到 URL 的 2048 字节大小限制。

于 2013-11-22T13:17:08.767 回答
16

此代码会将 base64 编码的字符串显示为图片:

NSString *str = @"data:image/jpg;base64,";
str = [str stringByAppendingString:restauInfo.picture];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:str]];

restauInfo.picture 是一个 NSString,其中包含 base64 编码的 JPG

在我的情况下,来自“restauInfo.picture”的值来自数据库

于 2012-09-07T12:24:20.777 回答
8

您可以执行以下操作:

(UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
  NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
  return [UIImage imageWithData:data];
}

然后像这样调用它:

UIImage *image = [self decodeBase64ToImage:dataString];
于 2014-08-25T23:22:05.160 回答
4
  1. 将 Base64 解码为原始二进制文件。你自己在这里。你可能会发现有用cStringUsingEncoding:的。NSString
  2. 使用创建NSData实例dataWithBytes:length:
  3. 用来[UIImage imageWithData:]加载它。
于 2009-09-02T10:23:38.937 回答
2

谢谢porneL

我可以使用 google 找到 Base64 脚本: Base64.m

所以我稍微修改了一下,就可以得到一个有效的测试代码:

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]];
于 2009-09-02T10:47:52.070 回答
2

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
于 2015-08-07T20:54:22.830 回答
2

斯威夫特 4+

let base64EncodedString = "" // Your Base64 Encoded String
if let imageData = Data(base64Encoded: base64EncodedString) {
                let image = UIImage(data: imageData)
                self.imageView.image = image
            }
于 2018-08-02T08:35:05.433 回答
1

以防万一有人正在寻找Swift代码来完成此操作(基于 Jonathan M 提供的Objective-C答案),这里是:

var data = NSData (base64EncodedString: base64String, options: NSDataBase64DecodingOptions(0))
var image = UIImage(data: data!)
于 2015-07-19T16:56:41.897 回答
1

就我而言,@Masche 在这里提出了一个解决方案。正如我在Swift 2.0中所需要的那样:

let url = NSURL(string: imageString)
let data = NSData.init(contentsOfURL: url!)
let image = UIImage(data: imageData)
于 2015-10-11T18:45:50.967 回答
0

用于下载包含 base64 图像字符串的文本文件,然后保存/读取文件并最终创建图像以在视图中显示的代码片段

如果您需要将图像解码为 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;
    }
}
于 2016-02-06T09:12:22.643 回答