お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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