4

私は以前にこの質問をしました:exifメタデータを画像に書き込む方法

メタデータを挿入する方法を見つけました。ただし、その結果、画像がメモリにコピーされます。大きな画像があり、すでにメモリにコピーが必要な場合、これはパフォーマンスを向上させ、メモリクラッシュを引き起こす可能性があります。

画像のコピーを作成せずにメタデータを挿入する正しい方法はありますか?おそらく、ディスクに書き込まれた後、ファイルに追加される可能性がありますか?

可能であれば、このためだけにサードパーティのライブラリに頼る必要はなく、ネイティブ実装を好みます。

4

3 に答える 3

1

この質問には、必要なものに応じて、少量または大量のコードが必要になる場合があります。EXIF データは、JPEG APP1 マーカー (FFE1) に格納されます。これは、TIFF ヘッダー、IFD、およびデータを含む個々のタグを含む TIFF ファイルに非常によく似ています。独自の APP1 マーカー セグメントを作成できれば、それを JPEG ファイルに挿入したり置き換えたりするのは簡単です。既存のファイルからメタデータを読み取る場合は、いくつかの新しいタグを追加してから書き戻すと、より複雑になる可能性があります。EXIF データのトリッキーな部分は、4 バイト以上を必要とするタグです。各 TIFF タグは 12 バイトです。2 バイトのタグ、2 バイトのデータ型、4 バイトのカウント、4 バイトのデータです。データがタグの 4 バイトに完全に収まらない場合、タグはデータを検索する場所のファイルへの絶対オフセットを指定します。既存のデータにこのようなデータを持つタグがある場合 (例: make、model、キャプチャ日、キャプチャ時間など)、オフセットを修正してそのデータを再パックし、独自のデータを追加する必要があります。手短に:

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

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

タグとディレクトリ構造を理解するために、TIFF 6.0 仕様を読むことから始めます。

TIFF 6.0 仕様

次に、JPEG EXIF 仕様を見てみましょう。

EXIF 2.2 仕様

于 2012-03-27T15:09:53.717 に答える
0

CGImageSourceRef を使用すると、すべての画像データをメモリにロードすることなく、サムネイルを含む画像プロパティを取得できます。このようにして、メモリは UIImage と NSData によって浪費されません。

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL);

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

CGImageDestinationAddImageFromSource (destRef,    
                                      imageSource,
                                      0,
                                     (CFDictionaryRef)propertes );//exif
BOOL success = CGImageDestinationFinalize(destRef);
于 2012-03-31T23:04:20.107 に答える
0

既存のexifマニピュレータソフトウェアでできると思いますが、テストしていません。

リンク:

于 2012-03-29T06:47:03.300 に答える