2017-02-08 6 views
0

NSKeyedArchiverを使用してエンコードおよびデコードしようとすると、このコードスニペットのUIImageが元の状態に復元されないのはなぜですか?なぜ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 imageNamed:]を使って作成したUIImageが、他のUIImageと同じ方法でシリアル化していないということです。おそらく、イメージがアプリケーションバンドルから来たことを知っているからです... –

答えて

0

私は解決策を見つけました。

これは、画像が[UIImage imageNamed:]を通じて読み込まれるだけです。 UIImageが[UIImage imageWithContentsOfFile:]によって作成された場合、問題は発生しません。

私はこれがios側のバグであるに違いないと信じています。 imageNamed:UIImageを作成する方法は、特にバンドル内の画像用です。 UIImageが画像データを実際には含んでいないように見えるので、NSCoderが意図したとおりに機能しないような最適化が必要です(画像がUIImageを期待どおりに再作成するのではなく、

0

チェック画像にこの

デコードデータ:

+(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.正しいイメージファイル

出力は、出力が

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

ある

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

2.誤った/破損した画像ファイル

あるソースJPGファイルが壊れているか無効であるようなので、見えます。

+0

私のイメージは壊れていない、私はそれを他の多くのアプリでうまく開くことができます –

関連する問題