Как отобразить изображение base64 в UIImageView?

Я получил изображение Base64 gif:

R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7 

Теперь я хочу отобразить эту строку Base64 в моем приложении IPhone.

Я мог бы получить эту работу с помощью WebView:

 aUIWebView.scalesPageToFit = NO; aUIWebView.opaque = NO; aUIWebView.backgroundColor = [UIColor clearColor]; [aUIWebView loadHTMLString: @"" baseURL:nil]; 

Можно ли сделать то же самое, используя UIImageView?

Вам не нужно его кодировать. Просто сделайте NSUrl, он знает «данные:» – 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]; 

Очень прост в использовании и не будет превышать ограничение размера байта 2048 URL.

В этом коде будет отображаться строка с кодировкой base64 в виде изображения:

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

restauInfo.picture – это NSString, который содержит JPG с кодировкой base64

В моем случае значение из «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 до необработанного двоичного кода. Вы здесь по-своему. Вы можете найти cStringUsingEncoding: из NSString полезно.
  2. Создание экземпляра NSData с использованием dataWithBytes:length:
  3. Используйте [UIImage imageWithData:] чтобы загрузить его.

Благодаря porneL

Я могу найти скрипт Base64, используя google: 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]]; 

На всякий случай, если кто-то ищет код Swift для этого (на основе ответа 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. Поскольку мне это нужно в Swift 2.0, так:

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

Фрагмент кода для загрузки текстового файла с внутренней строкой образа 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; } } 

Swift 4+

 let base64EncodedString = "" // Your Base64 Encoded String if let imageData = Data(base64Encoded: base64EncodedString) { let image = UIImage(data: imageData) self.imageView.image = image } 
  • Создание UIImage в форме круга
  • Ошибка UIActivityViewController на iOS 8 iPads
  • iOS 5: Интересно о UIAppearance
  • Статическая строковая переменная в Objective C на iphone
  • Чтение образцов с помощью AVAssetReader
  • Легкий способ убрать клавиатуру?
  • Сохранение изображения в plist
  • Можно ли отключить плавающие заголовки в UITableView с помощью UITableViewStylePlain?
  • Что именно делает делегат в проекте xcode ios?
  • Как изменить формат даты в подборщике даты
  • applicationWillEnterForeground против applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground
  • Interesting Posts

    Как я могу переадресовать свой IP-адрес localhost на эмулятор Android?

    Запустить почтовый клиент с приложением?

    TThread.resume устарел в Delphi-2010, что нужно использовать на месте?

    2D-массив как аргумент функции

    Включая один исходный файл C в другой?

    Должен ли ServiceStack быть служебным слоем в приложении MVC или должен ли он вызвать сервисный уровень?

    Redis + ActionController :: Живые streamи не умирают

    Яркость монитора ноутбука изменяется в зависимости от отображаемого изображения

    Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?

    Открыть ссылку в новой TAB (WebBrowser Control)

    Как выполнить команду MySQL из сценария оболочки?

    Я назвал папку символом для пробела, и теперь, когда я перешел на Windows, мне нужно переименовать его

    Clipboard.GetText возвращает null (пустая строка)

    Как найти все символические ссылки в Windows Vista или 7?

    Java Reflection: как получить имя переменной?

    Давайте будем гением компьютера.