Как отобразить изображение base64 в UIImageView?
Я получил изображение Base64 gif:
R0lGODlhDAAMALMBAP8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAUKAAEALAAAAAAMAAwAQAQZMMhJK7iY4p3nlZ8XgmNlnibXdVqolmhcRQA7
Теперь я хочу отобразить эту строку Base64 в моем приложении IPhone.
Я мог бы получить эту работу с помощью 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?
Ответы
Ответ 1
Вам не нужно его кодировать. Просто сделайте NSUrl, он знает "данные:" - url.
NSURL *url = [NSURL URLWithString:base64String];
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *ret = [UIImage imageWithData:imageData];
Как уже упоминалось в комментариях, вы должны убедиться, что вы добавили свои данные с помощью data:image/png;base64,
, иначе ваши данные base64 бесполезны.
Ответ 2
Очень старый вопрос, но с iOS7 есть новый, гораздо более простой способ сделать это, поэтому я пишу его здесь, чтобы будущие читатели могли это использовать.
NSData* data = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
UIImage* image = [UIImage imageWithData:data];
Очень прост в использовании и не будет превышать ограничение размера байта 2048 URL.
Ответ 3
В этом коде будет отображаться строка с кодировкой 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" происходит из базы данных
Ответ 4
Вы можете сделать что-то вроде следующего:
(UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
return [UIImage imageWithData:data];
}
Затем назовите его следующим образом:
UIImage *image = [self decodeBase64ToImage:dataString];
Ответ 5
- Декодировать Base64 до необработанного двоичного кода. Вы здесь по-своему. Вы можете найти
cStringUsingEncoding:
of NSString
полезным.
- Создайте экземпляр
NSData
с помощью dataWithBytes:length:
- Используйте
[UIImage imageWithData:]
для его загрузки.
Ответ 6
Спасибо porneL
Я могу найти Base64 script с помощью 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]];
Ответ 7
На всякий случай кто-то ищет код Swift для выполнения этого (на основе ответа Objective-C, предоставленного Джонатаном М), вот он:
var data = NSData (base64EncodedString: base64String, options: NSDataBase64DecodingOptions(0))
var image = UIImage(data: data!)
Ответ 8
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];
Swift
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
Ответ 9
В моем случае работало решение, предложенное здесь @Masche. Поскольку мне это нужно в Swift 2.0, поэтому:
let url = NSURL(string: imageString)
let data = NSData.init(contentsOfURL: url!)
let image = UIImage(data: imageData)
Ответ 10
фрагмент кода для загрузки текстового файла с базой изображений 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;
}
}