jpegの画像サイズ取得

解決


mizuki  2014-03-27 02:02:33  No: 46171

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;


mizuki  2014-03-27 02:06:44  No: 46172

提出したのを見たら間違えていました。
        PicW:=strtofloat(d1);  ==> PicW:=strtoint(d1);
        PicH:=strtofloat(d2);  ==> PicH:=strtoint(d2);


Mr.XRAY  2014-03-27 07:08:51  No: 46173

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 が自動で型変換してくれます.


mizuki  2014-03-27 23:18:22  No: 46174

Mr.XRAY様  見事成功し、大変感謝しています。
外見から見て制御文字列が入っているなど思いもよらずあれこれいじって時間ばかり経ってしまっていましたがこれで解決できました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加