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; |
・インターネット上の情報や書籍の内容を一部参考に作成してます。 ・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。 ・記述内容に問題点や改善点がありましたらこちらまでお願いします。 |