function GetJPEGSize( FileName:String; var AWidth, AHeight:Integer;
var CMYK :Boolean ): Boolean;
function SwapEndian(S :word):word;
begin
Result := (S and $00FF) shl 8 + (S and $FF00) shr 8;
end;
const
SOF0 : Word = $FFC0; // Normal
SOF2 : Word = $FFC2; // Progressive
var
wrk : Word ;
Sampling : Byte;
AStream : TStream;
begin
Result := False;
AStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
// JFIF
AStream.ReadBuffer(wrk,2); wrk := SwapEndian(wrk);
if wrk<>$FFD8 then Exit;
While True do begin
AStream.ReadBuffer(wrk,2); wrk := SwapEndian(wrk);
// JPEG Maker
if (wrk= SOF0) or (wrk= SOF2) then begin
// Skip Segment Length
AStream.Position := AStream.Position+2;
// Skip Sample
AStream.Position := AStream.Position+1;
// Height
AStream.ReadBuffer(wrk,2); AHeight := SwapEndian(wrk);
// Width
AStream.ReadBuffer(wrk,2); AWidth := SwapEndian(wrk);
// ColorMode
AStream.ReadBuffer(Sampling,1);
CMYK := (Sampling=4);
Result :=True;
Break;
end
else if (wrk=$FFFF) or (wrk=$FFD9) then begin
Break;
end;
// Skip Segment
AStream.ReadBuffer(wrk,2); wrk := SwapEndian(wrk);
AStream.Position := AStream.Position+(wrk-2);
end;
finally
AStream.Free;
end;
end;
<< 使用例 >>
procedure TForm1.Button1Click(Sender: TObject);
var
sx, sy: integer;
CMYK: boolean;
begin
if GetJPEGSize(ファイル名,sx,sy,CMYK)=FALSE then Exit;
if CMYK then begin
MessageDlg( 'このファイルは未対応',mtError,[mbOk],0 );
Exit;
end;
//ファイルの読み込み処理
end;
|
|
・インターネット上の情報や書籍の内容を一部参考に作成してます。 ・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。 ・記述内容に問題点や改善点がありましたらこちらまでお願いします。 |