2012-03-21 28 views
4

私は以前この質問をしました:How to write exif metadata to an imageイメージをコピーせずにイメージにexifメタデータを挿入する方法は?

私は今、メタデータを挿入する方法を見つけました。ただし、イメージのコピーがメモリに格納されます。イメージが大きく、すでにメモリにコピーが必要な場合は、パフォーマンスが低下し、メモリがクラッシュする可能性があります。

イメージのコピーを作成せずにメタデータを挿入する正しい方法はありますか?おそらく、ディスクに書き込まれた後にファイルに貼り付けることができますか?

可能であれば、サードパーティのライブラリに頼らずに、ネイティブ実装を好むでしょう。

+0

メタデータをファイルに追加する場合、ファイルのサイズは大きくなります。これを管理するためには、データをメモリに読み込んだり、データを追加して書き戻したり(OSが明らかにしているもの)、一度にファイルの小さなチャンクを読み書きする独自のコードを書くことができます。 – BitBank

+0

はい、私は完全にメモリにそれを読んでいませんが、私が知っているすべてのAppleのAPIが必要です。私が正しいフォーマットを知らず、ファイルを壊さないことを望んでいるにもかかわらず、読んだり少し書いたりすることは、私が言及していることです。 – akaru

答えて

1

この質問には、必要なものによっては多少のコード​​が必要になることがあります。 EXIFデータはJPEG APP1マーカー(FFE1)に保存されます。これは、TIFFヘッダー、IFD、およびデータを持つ個々のタグを持つTIFFファイルと非常によく似ています。独自のAPP1マーカーセグメントを作成することができれば、それを挿入するかJPEGファイルに置き換えるのは簡単です。既存のファイルからメタデータを読み取ろうとする場合は、新しいタグをいくつか追加してから書き戻してください。 EXIFデータのトリッキーな部分は、4バイト以上必要なタグです。各TIFFタグは、2バイトタグ、2バイトデータタイプ、4バイトカウント、4バイトデータの12バイトです。データがタグの4バイトに完全に収まらない場合、タグはデータを見つける場所のファイルへの絶対オフセットを指定します。既存のデータにこのようなデータを持つタグ(メイク、モデル、キャプチャ日付、キャプチャ時間など)がある場合は、オフセットを修正してデータを再パックし、独自のデータを追加する必要があります。簡単に言えば、

1)あらかじめ作成されたAPP1マーカーをJPEGファイルに追加する場合、これは簡単でコードはほとんど必要ありません。

2)既存のメタデータをJPEGファイルから読み込み、独自に追加して書き戻す必要がある場合、コードはもう少し複雑です。それは難しいことではありませんが、データのブロックを読み書きするだけではありません。 JPEG EXIF仕様を見て、

TIFF 6.0 spec

次:タグとディレクトリ構造を理解するためのTIFF 6.0仕様を読み取ることで

スタート

EXIF 2.2 Spec

+0

私はNSDictionaryとしてexifデータを持っているので、読み込みは問題ではありません。マーカーの作成の詳細を行うことができるライブラリを知っていますか?私は仕様を理解することができますが、もちろん、私は車輪を再発明する必要はありません。 – akaru

0

CGImageSourceRefメモリに全ての画像データをロードせずに、そのサムネイルを含む画像特性を得るために使用することができます。このようにして、UIImageとNSDataはメモリを無駄にしません。

次に、ソースイメージとexifデータを追加してCGImageDestinationRefを保存します。

CGImageDestinationAddImageFromSource (destRef,  
             imageSource, 
             0, 
            (CFDictionaryRef)propertes);//exif 
BOOL success = CGImageDestinationFinalize(destRef); 
+0

私はこれについてドキュメントを見てきました。データをどのように取得するのか理解できますが、これをディスク上の元の画像に挿入する方法を理解していません。ちょうどサムネイルのCGImageSourceRefを作成すると、CGImageDestinationAddImageFromSourceを呼び出すときに元の画像を上書きしますか? – akaru

+0

AppleのSquareCamの例をご覧ください。 writeCGImageToCameraRollメソッドには、作成先があり、ソースデータを追加してディスク/アルバムに保存します。 –

+0

@AlexLメタデータに存在するサムネイルを取得するにはどうすればよいですか?サムネイルにアクセスするための「キー」はありません! – neeraj

関連する問題