Win7 + XE3 starter
jpeg画像のサイズを取得したいのですが古いデジカメで撮ったEXIFの付いていない画像はが沢山あるためEXIFから求めることができません。 そこで次のようにして求めたいとやってみましたところd:= vartostr(Folder.GetDetailsOf(FolderItem, 31));の行でdには '640 x 480'のように入るのですが、これを幅と高さ(Integer)にするところでエラーが出てしまいます。dは何か特殊な文字列なのかわかりません。 対策がありましたら教えてください。
Var
PicW,PicH:integer;
procedure GetJPGsize(PicFile:string);
var
Shell: OleVariant;
Folder: OleVariant;
i,p: Integer;
FolderItem: OleVariant;
filepath,filename:string;
d,d1,d2:string;
begin
FilePath := ExtractFileDir(picfile);
FileName := ExtractFileName(picfile);
shell := CreateOleObject('Shell.Application');
Folder := Shell.NameSpace(OleVariant(FilePath));
FolderItem := Folder.ParseName(FileName);
d:= vartostr(Folder.GetDetailsOf(FolderItem, 31));
p:=pos('x',d);
d1:=leftstr(d,p-1); d1:=trim(d1);
d2:=copy(d,p+1,200); d2:=trim(d2);
PicW:=strtofloat(d1);
PicH:=strtofloat(d2);
FolderItem := Unassigned;
Folder := Unassigned;
Shell := Unassigned;
end;
提出したのを見たら間違えていました。
PicW:=strtofloat(d1); ==> PicW:=strtoint(d1);
PicH:=strtofloat(d2); ==> PicH:=strtoint(d2);
GetDetailsOf で取得した文字列には,空白以外の制御文字類が含まれています.
取得した文字列の長さを調べると確認できます.
この制御文字は,ファイルのプロパティ等のメタデータ操作用の区切り文字です.
文字列として処理する場合の対処方法はいくつか考えられますが,例えば
(1) 文字として表示不可の文字を削除する Trim 関数を自作する
(2) 表示しない文字を空白に変換してから処理する
以下は (2) の方法の場合の1つの方法です.
for i := 1 to Length(d) do begin
if not CharInSet(d[i], ['0'..'9', 'x']) then d[i] := ' ';
end;
または,
for i := Length(d) downto 1 do begin
if not CharInSet(d[i], ['0'..'9', 'x']) then Delete(d, i, 1);
end;
参考までに,Delphi XE3 であれば,
d:= vartostr(Folder.GetDetailsOf(FolderItem, 31));
の vartostr は不要です.Delphi が自動で型変換してくれます.
Mr.XRAY様 見事成功し、大変感謝しています。
外見から見て制御文字列が入っているなど思いもよらずあれこれいじって時間ばかり経ってしまっていましたがこれで解決できました。
ありがとうございました。
ツイート | ![]() |