2015年2月4日水曜日

TIFFか!TIFFか!TIFFなのか!!:iOSのカメラアプリでメーカー名などを写真のEXIFに埋め込む



えーと。こんばんは。

今日一日苦しんでた不具合がやっと解消されそうなので、愚痴を吐きます。げえーっ。

つい先日、Apple様のApp StoreにiPhoneアプリを公開した訳ですが。

ボスからまた連絡が。「このアプリ使えんの?」
いやー、使えますよ、やだなあえへへへ、と答えようとしたら、
「EXIF情報ないんだけど」

( ̄△ ̄;)

そ、そんなはずは・・・。
EXIF情報は、Android版を作ったときに散々やったしなー・・・
Commons Imagingちゃん口説き落とした: Exif情報のコピー

まあでも、そんなこと言ってても仕方ない。できてないもんはできてない。
で、確認してみましたら、

・・・。うん、確かに無いね。
いや、大事な情報の、「DateTimeOriginal」と「DateTimeDigitized」はきちんと保存されてる・・・されてるけど・・・
他の情報がほとんどない
・・・えええええ・・・。

NSDictionary作るときに、きちんとCGImageSourceCopyPropertiesAtIndexでコピーしたんだけどなー・・・。と思いつつ、コードをもいっぺん見てみると
NSMutableDictionary *EXIFDictionary = [[NSMutableDictionary alloc] init];
コピーしてねぇじゃん orz オイ俺!しっかりせえ!1
あかんわー。初期化して、箱だけ作って満足してるじゃんー。
慌てて修正。こんな感じに。
NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
これで安心。ふー。
と思ったけど、・・・んー。なんか、メーカー名(「Apple」とか)、モデル名とか、あとは作成日付とか、そこら辺の情報がまだ保存されてないのよねー。
リファレンス(こちら)見て、関係ありそうなのはセットしてるんだけどなー。

メーカー名とモデル名は、特に変更しないから、最初にmutableCopyで持ってきたもの使えばいいし。
変更したいのは撮影日時とデータ化日時だから、それはsetObjectしてるし・・・
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeOriginal];
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeDigitized];

EXIFのDictionaryに、他に関係してるエントリはないしなー・・・と思いつつ、ふと「TIFF Dictionary Keys」の方も覗いてみましたら。
const CFStringRef kCGImagePropertyTIFFMake;
const CFStringRef kCGImagePropertyTIFFModel;
const CFStringRef kCGImagePropertyTIFFDateTime;
あるやん あるある あるやんかー・・・
( ̄△ ̄;)

で、TIFFのディクショナリー追加して、
 NSMutableDictionary *TIFFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyTIFFDictionary]mutableCopy];
このエントリたちをsetObjectして・・・。
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyTIFFDateTime]; 
[TIFFDictionary setObject:Make forKey:(__bridge NSString *) kCGImagePropertyTIFFMake]; 
[TIFFDictionary setObject:Model forKey:(__bridge NSString *) kCGImagePropertyTIFFModel]; 
[TIFFDictionary setObject:Software forKey:(__bridge NSString *) kCGImagePropertyTIFFSoftware];
ビルドしてみたら。
ほい。
半日以上悩んでたのが、あっという間に解決しましたよ。
( ̄∇ ̄;)

ま、できたから良いとすっか・・・。


あと関係ないけど、kCGImagePropertyMakerAppleDictionaryって何に使うんだろな・・・。最初これが無いせいかと思って追加したけど、なーんも変わらなかった。しくしく。


0 件のコメント:

コメントを投稿