お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"JPEGを伸長しないで画像サイズを取得"




{
JPEGの縦と横のサイズを取得します。JPEGデータの伸長をしないので高速です。
コメントを入れているJPEGもちゃんと取得できると思います。

注1:ほとんど標準と言って良いJFIFしか調べない様にしています。(手元に他の
JPEGがないので(^^;)

TFileStreamを使うのは始めてなので変な所がありましたら添削お願いします。
}


function DByteToSWord(HDByte,WDByte : array of Byte):String;
begin
 Result := IntToStr(WDByte[0] * 256 + WDByte[1]) +' x ' +
           IntToStr(HDByte[0] * 256 + HDByte[1]);
end;

function GetJpegSize(const FileName:String;
                     var JWidth,JHeight:Word):String;
var
 F : TFileStream;
 Buf : Byte;
 Buf3 :Integer;
 JFIF : array[0..3] of Char;
 i : Integer;
 W,H:array[0..1] of Byte;
{上はWordで読み取りたいのですが反転してしまうので仕方なくByteの配列に読
ませています。(例えば02 58なのが58 02になる)上位バイトと下位バイトを反転
させる方法がわかりません(^^;)}
begin
Result := '不明'; JWidth  := 0; JHeight := 0;

F := TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
 try
  F.Position := 6;
  F.Read(JFIF,4);
  if JFIF = 'JFIF' then //(注1)
   begin
    for i := 0 to F.Size do
     begin
      F.Position := i;
      F.Read(Buf,1);
      if Buf = $FF then
       begin
        F.Read(Buf,1);
        //$C0はノーマルJPEG、$C2がプログレッシブJPEG
        if (Buf = $C0) or (Buf = $C2) then
         begin
          F.Read(Buf3,3);
          //$081100はカラーのJPEG、$080B00はグレイスケール
          if (Buf3 = $081100) or (Buf3 = $080B00) then
           begin
            F.Read(H,2);
            F.Read(W,2);
            Result := DByteToSWord(W,H);
            JWidth  := W[0] * 256 + W[1];
            JHeight := H[0] * 256 + H[1];
            Break;
           end;
         end
        else
         begin
          if Buf = $C4 then //$C4以降は調べない
           begin
            F.Read(Buf,1);
            if Buf = $00 then //取り敢えず(^^;
              Break;
           end;
         end;
       end;
      if i >= 1024 then //1KB以降にはないと仮定してます出鱈目な判断です
        Break;          //ので、好きに変更してください(^^;
     end;
   end
  else
   Result := 'JPEG(JFIF)じゃないです';
 finally
  F.Free;
 end;
end;

                                        紅月 燐火(BZF05041)

Original document by 紅月 燐火      氏 ID:(BZF05041)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum