2012-04-09 13 views
0

2つの画像解析機能を実行する画像処理アプリケーションを作成しています。 1つは画像のRGBデータを読み取るもので、もう1つはEXIFデータを読み取るものです。私はフロントカメラで写真を撮ってから、ドキュメントフォルダに保存しています。 RGB値を取得するには、次のように画像をロードします。iPhone EXIFデータがドキュメントフォルダから読み取られない

NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"]; 
UIImage *image = [UIImage imageWithContentsOfFile:jpgPath]; 
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
const UInt8* data = CFDataGetBytePtr(pixelData); 

これは期待どおりに動作し、ピクセルデータを取得できます。私の問題は、EXIFデータを収集しています。 RGBと同じ方法で画像の読み込みを実装しています。すべてのEXIFデータがNULLとして戻ってきます。

NSString *EXIFPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"]; 
NSURL *url = [NSURL fileURLWithPath:EXIFPath]; 

CGImageSourceRef sourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL); 

NSDictionary *immutableMetadata = (__bridge NSDictionary *) CGImageSourceCopyPropertiesAtIndex(sourceRef,0,NULL); 
NSDictionary *exifDic = [immutableMetadata objectForKey:(NSString *)kCGImagePropertyExifDictionary]; 

NSNumber *ExifApertureValue = [exifDic objectForKey:(NSString*)kCGImagePropertyExifApertureValue]; 
NSNumber *ExifShutterSpeed = [exifDic objectForKey:(NSString*)kCGImagePropertyExifShutterSpeedValue]; 

NSLog(@"ExifApertureValue : %@ \n",ExifApertureValue); 
NSLog(@"ExifShutterSpeed : %@ \n",ExifShutterSpeed); 

私はこのようなアプリでプリロード画像を読み取るためのコードの最初の行を変更した場合:

NSString *aPath = [[NSBundle mainBundle] pathForResource:@"IMG_1406" ofType:@"JPG"]; 

それは動作します。問題は画像をプリロードできないことです。彼らはカメラから生きていなければなりません。どんな提案も大歓迎です。ありがとうございました。

+0

はここ http://stackoverflow.com/questions/1238838/uiimagepickercontroller-and-からあなたの答えをゲット既存の写真から抽出するEXIFデータ –

+0

http://stackoverflow.com/questions/9766394/get-exif-data-from-uiimage-uiimagepickercontroller/9890442#9890442 –

+0

私が持っているコードはEXIFデータを読み込みます画像が電話機のドキュメントフォルダにあるときには表示されません。 EXIFコードをすべて書き換えるのではなく、画像をどのように読み込んでいるかを修正する方法はありますか? – tguidon

答えて

1

このファイルTest.jpgはどのようにドキュメントディレクトリに書き込まれますか?それはUIImageJPEGRepresentationと書かれていますか?その場合、EXIFデータは失われます。メタデータが必要な画像のJPEGソースを保存してください。

何が起こっているかに関わらず、オブジェクトを取得するとすぐに完全なimmutableMetadataオブジェクトとexifDicオブジェクトを記録するのに役立ちます。

NSDictionary *immutableMetadata = (__bridge NSDictionary *) CGImageSourceCopyPropertiesAtIndex(sourceRef,0,NULL); 
NSLog(@"immutableMetadata = %@", immutableMetadata); 
NSDictionary *exifDic = [immutableMetadata objectForKey:(NSString *)kCGImagePropertyExifDictionary]; 
NSLog(@"exifDic"); 

あなたexifDicログのみ、以下の3つの値が含まれている場合は、EXIFヘッダを維持を気にしませんでした機能によって保存されています。動作しますが、良いかもしれませ

exifDic = { 
    ColorSpace = 1; 
    PixelXDimension = 1200; 
    PixelYDimension = 1600; 
} 

他の二つの事柄:

(1)ドキュメントディレクトリ)(NSHomeDirectoryのサブディレクトリであるという保証はありません。次のように、このドキュメントの場所を取得するための信頼できる方法は次のとおりです。

NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 
NSString *imagePath = [documentDirectory stringByAppendingPathComponent:@"Test.jpg"]; 

(2)あなたは、現在のピクセルを取得するために、一度メタデータを取得するために1回、2回のストレージから画像バイトをロードしています。それらをNSDataオブジェクトにロードすると、そのファイルを一度だけ取得する必要があります。 NSDataオブジェクトを保持しておき、詳細を失うことなく後でイメージを保存することができます。 (あなたがそれを必要とする場合にのみ、それを維持するので、これが、ファイルサイズと同等のメモリを消費します。)

NSData *imageData = [NSData dataWithContentsOfFile:imagePath]; 
UIImage *image = [UIImage imageWithData:imageData]; 
// Do things involving image pixels... 

CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef) imageData, NULL); 
// Do things involving image metadata... 
関連する問題