FDELPHIでRESしたものそのまま持ってきました。簡易バイナリチェックをして画像を読み込む関数です。TPictureは拡張子が登録されていない場合例外を生成しますが、この関数を使えば読み込むことができるようになります。
type
TImageType = (itUnknown, itJpeg, itBitmap);
TUnionFileHeader = packed record
case Integer of
0:(//JPEG用
Code_1 : array[0..3]of Char;
Dummy_1: Word;
Code_2 : array[0..3]of Char;
);
1:(//ビットマップ用
bfType: Word;
bfSize: DWORD;
bfReserved1: Word;
bfReserved2: Word;
);
end;
function GetGraphicFormat(const FileName: String): TImageType;
//バイナリを調べる
var
F: TFileStream;
Buffer: TUnionFileHeader;
begin
Result := itUnknown;
F := TFileStream.Create(FileName, fmOpenRead);
try
FillChar(Buffer, SizeOf(TUnionFileHeader), $FF);
F.Read(Buffer, SizeOf(TUnionFileHeader));
with Buffer do
if bfType = $4D42 then
begin
if (bfSize = DWORD(F.Size)) and (bfReserved1 = 0) and
(bfReserved2 = 0) then
Result := itBitmap;
end else begin
if (Code_1 = #$FF#$D8#$FF#$E0) and (Code_2 = 'JFIF') then
Result := itJpeg;
end;
finally
F.Free;
end;
end;
procedure LoadPicture(const FileName: String; Picture: TPicture);
//画像を読み込む(バイナリチェック付)
var
G: TGraphic;
begin
try
Picture.LoadFromFile(FileName);
except
on E: EInvalidGraphic do
begin
case GetGraphicFormat(FileName) of
itBitmap:G := TBitmap.Create;
itJpeg :G := TJPEGImage.Create;
else
raise EInvalidGraphic.Create('未対応の画像フォーマットです。');
end;
try
G.LoadFromFile(FileName);
Picture.Assign(G);
finally
G.Free;
end;
end;
end;
end;
|