プログラミングのメモ書きです。日記も兼ねてます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
よくデジカメなどで使われる「Exif」を読み込んでみます。(3日目)
はい。今日の内容は取得したデータがオフセットなのか実データか調べることでしたね。
正直な話、昨日「面倒」とか書いてたけど、大して面倒ではありませんでした。
またいつものサイトのデータですが、どうやら、「情報量が4バイトを超えるときは『オフセット』」らしいです。
というわけで、どうやら情報量を計算すればよさそうです。
で、情報量の計算ですが、「タイプごとの大きさ×情報数」で出ます。
・タイプごとの大きさについて。
BYTE,ASCII=1バイト(8Bit)
SHORT =2バイト(16Bit)
LONG =4バイト(32Bit)
RATIONAL =8バイト(64Bit)
Undefined =2バイト(16Bit)(サンプルでは「UNDEF」と表示)
SLONG =4バイト(32Bit)
SRATIONAL=8バイト(64Bit)
です。
ちなみにこんな関数になりました。
static int TypeSize[]={1,1,2,4,8,0,1,0,4,8};//タイプごとの大きさ
...
int CalcSize(EXIF_DIRECTORY *pED){
return pED->DataNum*TypeSize[pED->Type-1];
}
TypeSizeで、各大きさを保存して、CalcSize関数で計算しています。
pED->Type-1になっているのは、配列が0が起点なのにTypeが1で始まるからです。
んで、実際に比較するのは、
bool isData(EXIF_DIRECTORY *pED){
return (CalcSize(pED)>4)?false:true;
}
で、行っています。
ソースを乗っけておきますんでどうぞ。
ダウンロード(zip)
では。
正直な話、昨日「面倒」とか書いてたけど、大して面倒ではありませんでした。
またいつものサイトのデータですが、どうやら、「情報量が4バイトを超えるときは『オフセット』」らしいです。
というわけで、どうやら情報量を計算すればよさそうです。
で、情報量の計算ですが、「タイプごとの大きさ×情報数」で出ます。
・タイプごとの大きさについて。
BYTE,ASCII=1バイト(8Bit)
SHORT =2バイト(16Bit)
LONG =4バイト(32Bit)
RATIONAL =8バイト(64Bit)
Undefined =2バイト(16Bit)(サンプルでは「UNDEF」と表示)
SLONG =4バイト(32Bit)
SRATIONAL=8バイト(64Bit)
です。
ちなみにこんな関数になりました。
static int TypeSize[]={1,1,2,4,8,0,1,0,4,8};//タイプごとの大きさ
...
int CalcSize(EXIF_DIRECTORY *pED){
return pED->DataNum*TypeSize[pED->Type-1];
}
TypeSizeで、各大きさを保存して、CalcSize関数で計算しています。
pED->Type-1になっているのは、配列が0が起点なのにTypeが1で始まるからです。
んで、実際に比較するのは、
bool isData(EXIF_DIRECTORY *pED){
return (CalcSize(pED)>4)?false:true;
}
で、行っています。
ソースを乗っけておきますんでどうぞ。
ダウンロード(zip)
では。
PR
この記事にコメントする