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