16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:JPEGファイルからExifのデータを取得・"
この発言は #01347 河邦 正 さんのJPEGファイルからExifのデータを取得・表示 に対するコメントです
河邦 正さん、こんにちはDoneです。
汚いソースですが、タグ情報なども表示できるものをアップします。
試作段階だったものをコピーしましたので、このままで動かないか
もしれません。なお、現在公開しているアプリのソースとは違い、
あくまで試作段階のものですので、バグがあるかもしれません(^^;
StringGridを貼り付けて、ColCountを2にしてください。ソースが長
いので分割してアップしています。
【ソース−1】
procedure TForm1.ExifRead(ExifFile: String);
function Swaping(W: DWord): Integer;
var
S: String;
begin
S:=IntToHex(W,8);
Result:=StrToInt('$'+Copy(S,7,2)+Copy(S,5,2)+Copy(S,3,2)+Copy(S,1,2));
end;
var
I,K,Hd,Hd2,Pt,X,Y: Integer;
TagNum,TagMode,Dt: Word;
Rt: Byte;
LDt,Rd,Rw1,Rw2,DataLength: DWord;
Rw3: Integer;
S,TagName,TagData,Xsize,Ysize: String;
Stream: TMemoryStream;
Swp,SFg,AFg: Boolean;
begin
StringGrid1.RowCount:=1;
StringGrid1.Cells[0,0]:='ファイル名:';
StringGrid1.Cells[1,0]:=ExtractFileName(ExifFile);
Xsize:='';
Ysize:='';
SFg:=False;
AFg:=False;
Hd:=-1;
Stream:=TMemoryStream.Create;
try
Stream.LoadFromFile(ExifFile);
for I:=0 to 255 do begin
Stream.Position:=I;
Stream.ReadBuffer(Dt,SizeOf(Word));
if Dt = Swap($FFD8) then begin
Hd:=I;
Break;
end;
end;
if Hd > -1 then begin
Stream.Seek(Hd,soFromBeginning);
//Exifの確認
Stream.Position:=Hd+2;
Stream.ReadBuffer(Dt,SizeOf(Word));
if Dt = Swap($FFE1) then begin
Hd:=Hd+12;
//インテルかモトローラの確認
Stream.Position:=Hd;
Stream.ReadBuffer(Dt,SizeOf(Word));
Swp:=Dt=$4D4D;
//最初のIFDへのオフセット
Stream.Position:=Hd+4;
Stream.ReadBuffer(LDt,SizeOf(DWord));
if Swp then LDt:=Swaping(LDt);
Stream.Position:=Hd+LDt;
Stream.ReadBuffer(Dt,SizeOf(Word));
if Swp then Dt:=Swap(Dt);
Pt:=Hd+LDt+2;
while Pt < Stream.Size do begin
TagName:='';
TagData:='';
//タグ番号の読み込み
Stream.Position:=Pt;
Stream.ReadBuffer(TagNum,SizeOf(Word));
if Swp then TagNum:=Swap(TagNum);
//データ個数の読み込み
Pt:=Pt+4;
Stream.Position:=Pt;
Stream.ReadBuffer(DataLength,SizeOf(DWord));
if Swp then DataLength:=Swaping(DataLength);
Pt:=Pt+4;
case TagNum of
0: Break;
$010f: begin
TagName:='メーカー名:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(DWord));
if Swp then Rd:=Swaping(Rd);
S:='';
if DataLength > 4 then begin
Stream.Position:=Hd+Rd;
for K:=1 to DataLength do begin
Stream.ReadBuffer(Rt,Sizeof(Byte));
if Rt > 19 then S:=S+Chr(Rt);
end;
TagData:=S;
end
else begin
Stream.Position:=Pt-4;
for K:=1 to DataLength do begin
Stream.ReadBuffer(Rt,Sizeof(Byte));
if Rt > 19 then S:=S+Chr(Rt);
end;
TagData:=S;
end;
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
end;
end;
$0110: begin
TagName:='製品名:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(DWord));
if Swp then Rd:=Swaping(Rd);
S:='';
if DataLength > 4 then begin
Stream.Position:=Hd+Rd;
for K:=1 to DataLength do begin
Stream.ReadBuffer(Rt,Sizeof(Byte));
if Rt > 19 then S:=S+Chr(Rt);
end;
TagData:=S;
end
else begin
Stream.Position:=Pt-4;
for K:=1 to DataLength do begin
Stream.ReadBuffer(Rt,Sizeof(Byte));
if Rt > 19 then S:=S+Chr(Rt);
end;
TagData:=S;
end;
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
end;
end;
//Sub
$829a: begin
TagName:='シャッター速度:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(DWord));
if Swp then Rd:=Swaping(Rd);
DataLength:=DataLength*8;
if DataLength > 4 then begin
Stream.Position:=Hd+Rd;
Stream.ReadBuffer(Rw1,SizeOf(DWord));
Stream.Position:=Hd+Rd+4;
Stream.ReadBuffer(Rw2,SizeOf(DWord));
if Swp then begin
Rw1:=Swaping(RW1);
Rw2:=Swaping(Rw2);
end;
end;
if Rw2 > Rw1 then
TagData:='1/'+FloatToStr(Rw2/Rw1)+'(s)'
else
TagData:=FloatToStr(Rw1/Rw2)+'(s)';
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
SFg:=True;
end;
end;
$829d: begin
TagName:='絞り値:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(DWord));
if Swp then Rd:=Swaping(Rd);
Stream.Position:=Hd+Rd;
Stream.ReadBuffer(Rw1,SizeOf(DWord));
Stream.Position:=Hd+Rd+4;
Stream.ReadBuffer(Rw2,SizeOf(DWord));
if Swp then begin
Rw1:=Swaping(RW1);
Rw2:=Swaping(Rw2);
end;
TagData:=FloatToStr(Rw1/Rw2);
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
AFg:=True;
end;
end;
$8822: begin
TagName:='露出モード:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(Word));
if Swp then Rd:=Swap(Rd);
Rd:=StrToInt('$'+ Copy(IntToHex(Rd,8),5,4));
DataLength:=DataLength*2;
case Rd of
1: TagData:='マニュアル';
2: TagData:='プログラム';
3: TagData:='絞り優先AE';
4: TagData:='シャッター速度優先AE';
5: TagData:='低速プログラムAE';
6: TagData:='高速プログラムAE';
7: TagData:='ポートレイト';
else TagData:='不明';
end;
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
end;
end;
$8827: begin
TagName:='ISO感度:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(Word));
if Swp then Rd:=Swap(Rd);
Rd:=StrToInt('$'+ Copy(IntToHex(Rd,8),5,4));
DataLength:=DataLength*2;
if DataLength > 4 then begin
Stream.Position:=Hd+Rd;
Stream.ReadBuffer(Rd,DataLength);
if Swp then Rd:=Swaping(Rd);
end;
TagData:=IntToStr(Rd);
if (Trim(TagName)<>'') and (Trim(TagData)<>'') then begin
StringGrid1.RowCount:=StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=TagName;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=TagData;
end;
end;
$9003: begin
TagName:='撮影日時:';
//データの読込
Stream.ReadBuffer(Rd,SizeOf(DWord));
if Swp then Rd:=Swaping(Rd);
S:='';
Original document by Done 氏 ID:(JCC01421)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|