web-dev-qa-db-fra.com

Comment afficher une image base64 dans un UIImageView?

J'ai eu cette image Base64 gif:

R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7

Maintenant, je veux afficher cette chaîne Base64 dans mon application IPhone.

Je pourrais obtenir ce travail en utilisant la 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];

Est-il possible de faire la même chose en utilisant UIImageView?

48
jantimon

Vous n'êtes pas obligé de l'encoder. Faites simplement un NSUrl, il connaît les "données:" - url. 

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

Comme mentionné dans les commentaires, vous devez vous assurer que vos données sont précédées de data:image/png;base64,, sans quoi vos données base64 sont inutiles.

126
masche

Très vieille question, mais à partir de iOS7, il existe un nouveau moyen beaucoup plus simple de le faire. C'est pourquoi je l'écris ici pour que les futurs lecteurs puissent l'utiliser.

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

Très facile à utiliser, et n'atteindra pas la limite de taille de 2048 octets d'une URL.

68
Jonathan M

Ce code affichera une chaîne encodée en base64 sous forme d'image:

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

restauInfo.picture est une chaîne NSString contenant le fichier JPG codé en base64

Dans mon cas, la valeur de "restauInfo.picture" provient d'une base de données.

15
Thorsten Niehues

Vous pouvez faire quelque chose comme ce qui suit:

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

Puis appelle ça comme ça:

UIImage *image = [self decodeBase64ToImage:dataString];
7
Radford7821
  1. Décoder Base64 en binaire brut. Vous êtes seul ici. Vous trouverez peut-être utile cStringUsingEncoding: of NSString.
  2. Créer une instance NSData à l'aide de dataWithBytes:length:
  3. Utilisez [UIImage imageWithData:] pour le charger.
4
Kornel

Merci porneL

Je pourrais trouver un script Base64 en utilisant Google: Base64.m

Je l'ai donc modifié un peu et j'ai pu obtenir un code de test fonctionnel:

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]];
2
jantimon

Juste au cas où quelqu'un cherche le code Swift pour y parvenir (basé sur le Objective-C answer fourni par Jonathan M), le voici:

var data = NSData (base64EncodedString: base64String, options: NSDataBase64DecodingOptions(0))
var image = UIImage(data: data!)
1
Martin

Extrait de code permettant de télécharger un fichier texte contenant une chaîne d'image base64, puis de sauvegarder/lire le fichier et de créer une image à afficher directement dans la vue

Si vous devez décoder une image en Base64, cliquez ici

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;
    }
}
1
d1jhoni1b

Objectif c

NSString *plainString = @"foo";

Codage 

NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [plainData base64EncodedStringWithOptions:0];
NSLog(@"%@", base64String);  

Décodage

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", decodedString); 

Option

NSURL *URL = [NSURL URLWithString:
  [NSString stringWithFormat:@"data:application/octet-stream;base64,%@",
       base64String]];

 return [NSData dataWithContentsOfURL:URL];

Rapide

let plainString = "foo"

Codage 

let plainData = (plainString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let base64String = plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
println(base64String) 

Décodage

let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.fromRaw(0)!)
let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding)    
println(decodedString) // foo
1
Carlos Parada

Dans mon cas, une solution proposée ici par @Masche a fonctionné. Comme j'en avais besoin dans Swift 2.0 so:

let url = NSURL(string: imageString)
let data = NSData.init(contentsOfURL: url!)
let image = UIImage(data: imageData)
1
Julian Król

Swift 4+

let base64EncodedString = "" // Your Base64 Encoded String
if let imageData = Data(base64Encoded: base64EncodedString) {
                let image = UIImage(data: imageData)
                self.imageView.image = image
            }
0
Maverick