2017-02-08 2 views
0

Почему UIImage в этом фрагменте кода восстанавливается в исходное состояние, когда я пытаюсь его кодировать и декодировать с помощью NSKeyedArchiver?Почему UIImage не был успешно декодирован?

Я ожидаю, что «decodedImage» будет содержать изображение после декодирования, но вместо этого это просто NULL.

// Any image here seems to repro the issue 
UIImage *image = [UIImage imageNamed:@"soda.jpg"]; 

// This prints YES (1), just a sanity check. 
NSLog(@"Confirms %d", [[UIImage class] conformsToProtocol:@protocol(NSCoding)]); 

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

[coder encodeObject:image forKey:@"image"]; 
[coder finishEncoding]; 

// I would expect this to be large, instead it's < 1kb. 
NSLog(@"Data length is: %zu", (unsigned long)data.length); 

NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 

// This prints YES (1) 
NSLog(@"containsValueForKey returns %d", [decoder containsValueForKey:@"image"]); 

// decodedImage is NULL here, even though containsValueForKey returned YES 
UIImage *decodedImage = [decoder decodeObjectForKey:@"image"]; 

[decoder finishDecoding]; 

В этом случае, я не искал обходной путь, как превращение UIImage в NSData первого и кодирования, что. Причина в том, что я пытаюсь воспроизвести несвязанный фрагмент кода, который использует что-то вроде этого, и я пытаюсь понять его.

Код работает, как ожидается, если я повернул изображение сначала через nsdata и обратно в uiimage, почему?

UIImage *originalImage = [UIImage imageNamed:@"soda.jpg"]; 
NSData *imageData = UIImagePNGRepresentation(originalImage); 
UIImage *image = [UIImage imageWithData:imageData]; 
+0

Я думаю, что эта странность связана с тем, что UIImage, созданный с использованием [UIImage imageNamed:], не сериализуется так же, как другие UIImages, возможно потому, что он знает, что изображение появилось из пакета приложений ... –

ответ

0

Я нашел решение.

Оказывается, это происходит только при загрузке изображения через изображение [UIImage imageNamed:]. Если UIImage создается через [UIImage imageWithContentsOfFile:], проблема не возникает.

Я считаю, что это должно быть ошибкой на стороне ios. ImageNamed: способ создания UIImage специально для изображений внутри пакета. Там должна быть какая-то оптимизация, которая заставляет NSCoder не функционировать должным образом, поскольку UIImage, по-видимому, фактически не содержит данные изображения (поскольку декодирование, похоже, возвращает нуль вместо воссоздания UIImage с изображением из пакета, как ожидалось).

0

Проверить это

Decode Данные изображения:

+(NSData *)decodeBase64ToImage:(NSString *)strEncodeData 
{ 

    NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
    return data; 
} 

self.btnLicenseFront.image=[UIImage imageWithData:[Themes decodeBase64ToImage:licenseFront]]; 
0

Я использовал свой код и попытался с 2 изображениями:

1. Файл Правильным образом

Выход

> [36133:5889153] Confirms 1 
> [36133:5889153] Data length is: 68267 
> [36133:5889153] containsValueForKey returns 1 
> [36133:5889153] decodedImage is 1879681920 

2. Неверная/поврежден файл изображения

Выход

> [36130:5888794] Confirms 1 
> [36130:5888794] Data length is: 136 
> [36130:5888794] containsValueForKey returns 1 
> [36130:5888794] decodedImage is 0 

Так выглядит ваш исходный файл JPG поврежден или недействительным.

+0

Мое изображение не повреждено, я могу открыть его просто отлично во многих других приложениях –

Смежные вопросы