objective animatedimage objective-c iphone uiimageview uiimage

objective c - animatedimage - ¿Cómo mostrar una imagen base64 dentro de un UIImageView?



objective c uiimage (11)

Tengo esta imagen gif Base64:

R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7

Ahora quiero mostrar esta Cadena Base64 dentro de mi aplicación de iPhone.

Podría hacer que esto funcione con la vista web:

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

¿Es posible hacer lo mismo usando UIImageView?


C objetivo

NSString *plainString = @"foo";

Codificación

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

Descodificación

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

Opción

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

Rápido

let plainString = "foo"

Codificación

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

Descodificación

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


  1. Decodificar Base64 a binario en bruto. Estás por tu cuenta aquí. Puede encontrar que cStringUsingEncoding: of NSString útil.
  2. Crea NSData instancia de NSData usando dataWithBytes:length:
  3. Use [UIImage imageWithData:] para cargarlo.

En caso de que alguien esté buscando el código Swift para lograr esto (basado en la respuesta de Objective-C proporcionada por Jonathan M), aquí está:

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


En mi caso funcionó una solución propuesta aquí por @Masche. Como lo necesitaba en Swift 2.0, así que:

let url = NSURL(string: imageString) let data = NSData.init(contentsOfURL: url!) let image = UIImage(data: imageData)


Este Código mostrará una cadena codificada en base64 como una imagen:

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

restauInfo.picture es una NSString que contiene el JPG codificado en base64

En mi caso, el valor de "restauInfo.picture" proviene de una base de datos


Fragmento de código para descargar un archivo de texto con una cadena de imagen base64 dentro, luego guardar / leer el archivo y finalmente crear una imagen para mostrar directamente en la vista

En caso de que necesite decodificar la imagen a Base64 haga clic aquí

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


Gracias porneL

Pude encontrar un script Base64 usando google: Base64.m

Así que lo modifiqué un poco y pude obtener un código de prueba funcional:

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


No tienes que codificarlo. Simplemente haga un NSUrl, conoce los "datos:" - url.

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

Como se mencionó en los comentarios, debes asegurarte de que antepones tus datos con data:image/png;base64, o de lo contrario, tus datos base64 son inútiles.


Pregunta muy antigua, pero a partir de iOS7 hay una forma nueva y mucho más fácil de hacerlo, por lo que la escribo aquí para que los futuros lectores puedan usarla.

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

Muy fácil de usar, y no alcanzará el límite de tamaño de 2048 bytes de una URL.


Puedes hacer algo como lo siguiente:

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

Entonces llámalo así:

UIImage *image = [self decodeBase64ToImage:dataString];


Swift 4+

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