JPG画像のexifメタデータに小さなカスタムXMLドキュメントを追加するための適切な呼び出しを正しい方向に向けることができるlibexifユーザー/開発者はいますか?
私はしばらくの間グーグルしていて、それを理解することができません。
私は、Cベースである限り、それを可能にする他のオープンソースライブラリを受け入れています。
JPG の EXIF データ ブロックに任意のデータを埋め込むことができます。私が認識しているサイズ制限はありません。必要に応じて、複数の EXIF データ ブロックに分割するだけです。
libexifさえ必要ありません。以下をプログラムで実行することにより、C コードですべて手動で実行できます (これは、既に他の EXIF データが含まれている JPG ファイルでのみ機能することに注意してください)。
基本的に、JPG ファイル (既に EXIF ヘッダーが含まれている場合) は次のような内容で始まります。
0xFF 0xD8
次に、最初の Exif ヘッダーは次のように始まります。
0xFF 0xE0
次は Exif データ ブロックの長さで、ここでは 2 バイトです。
0x00 0x10 //In this case it is 16 bytes (0x0010) long and it INCLUDES these two bytes of the header
次に、Exif データ ブロックの実際のデータが続きます (実際のデータは異なる場合があります)。長さは 14 バイト (または 14+ 2 = 16 バイト、または上記のように 0x0010)であることに注意してください。
0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x01 0x00 0x60 0x00 0x60 0x00 0x00
これで、exif データ識別子 (常に同じ) で始まるこのヘッダーの後に、XML Exif データ ブロックを挿入できます。
0xFF 0xE1
次に、XML ファイルのサイズ (バイト単位) + 2 (ファイルのサイズが 0xFFFE より大きい場合は、ファイルを複数の EXIF データ ブロックに分割する必要があることに注意してください):
0x07 0x7D //In this case it is 1917bytes long or 0x077D
次に、この時点で xml を直接 JPG に挿入し、残りのファイルはそのままにしておきます。
視覚的な説明については、下の図を参照してください (読めない場合は、右クリックして画像を表示してください)。
これは、ダミーの XML ファイルを含む JPG です。右クリックして保存し、Hex エディターで開いて、自分で探します。
EXIF データ ブロックに XML を含むサンプル JPG
最後に、まだ JPG を開くことができることを確認してください。できる場合は、成功しています。
C++ での簡単な例を次に示します (コードをデバッグしていないことに注意してください。メモリから書き込んだだけなので注意してください!):
char yourdata[]="<xml> contents to </add>";
long yourdatalen = 0x18;
//open file
char * file;
long filelen=0;
std::ifstream infile;
infile.open("yourjpg.jpg",std::ios::binary| std::ios::in);
//find size of file
infile.seekg (0, ios::end);
filelen = infile.tellg();
infile.seekg (0, ios::beg);
//read contents of file
file = new char [filelen];
infile.read(file,filelen);
infile.close();
//lets parse through the file and find any exif headers
long x=0;
if ((file[0]==0xFF) && (file[1]==0xD8)){
//all good lets go!!
while ((file[x]!=0xFF) && (file[x+1]!=0xE1)) {
x++;
}
//were at the first EXIF data block! insert XML here
char * temp=file;
file = new char [filelen+yourdatalen+4];
memcpy(file,temp,x);
file[x+0]=0xFF;
file[x+1]=0xE1;
file[x+2]=int((yourdatalen+2)/0xFF); //note assumes that your xml file is less than 0xFFFE bytes long
file[x+3]=yourdatalen-int((yourdatalen+2)/0xFF);
memcpy(&file[x+4],yourdata,yourdatalen);
memcpy(&file[x+4+yourdatalen],temp[x],filelen-x);
delete [] temp;
//Save to file
std::ofstream ofile;
ofile.open("savejpg.jpg",std::ios::binary| std::ios::out);
ofile.write(file,yourdatalen+4+filelen);
ofile.close();
}
else {
//JPG file does not have exif data in it, you'll need to add it first or find another way of adding your data
}
//Clean up
delete [] file;
私は HxD を使用しましたが、任意の 16 進エディターを使用できます。
EXIFフィールドの最大サイズは32KBだと思います。したがって、XMLファイルを作成するにはこれで十分です。
おそらくlibxml2を使用して、XMLツリーのASCIIC文字列表現を生成します。次に、EXIFの「ユーザーコメント」タグをその文字列に設定します。
次の例では、このタグを設定します。http: //libexif.cvs.sourceforge.net/viewvc/libexif/libexif/contrib/examples/write-exif.c?view= markup
そのASCII_COMMENTプレフィックスを使用する必要があると思います。FILE_COMMENTがXML文字列になります。