При работе с изображениями в среде Delphi часто возникает необходимость узнать размеры изображения перед тем, как открыть файл. Это может быть полезно для предварительного просмотра, валидации данных или оптимизации процесса загрузки. В данной статье рассмотрим, как можно быстро определить размеры изображений форматов JPEG, BMP, PNG и GIF без их открытия.
JPEG
Для JPEG изображений размер можно определить, прочитав заголовок файла. Вот пример кода, который считывает размеры:
procedure GetJPGSize(const sFile: string; var wWidth, wHeight: word);
var
f: TFileStream;
Sig, Buf: array[0..1] of byte;
Offset: word;
begin
FillChar(Sig, SizeOf(Sig), #0);
f := TFileStream.Create(sFile, fmOpenRead);
try
f.Read(Sig[0], SizeOf(Sig));
if (Sig[0] = $FF) and (Sig[1] = $D8) then
begin
FillChar(Buf, SizeOf(Buf), #0);
while True do
begin
f.Read(Buf[0], SizeOf(Buf));
case Buf[0] of
$C0, $C1:
begin
f.Read(Buf, 3);
wHeight := ReadMWord(f);
wWidth := ReadMWord(f);
Break;
end;
$FF:
begin
ReadMWord(f, Offset);
f.Seek(Offset - 2, 1);
end;
else
Continue;
end;
end;
end;
finally
f.Free;
end;
end;
BMP
BMP файл имеет четко определенный формат, и размеры можно определить, прочитав заголовок файла:
function FetchBitmapHeader(PictFileName: String; Var wd, ht: Word): Boolean;
var
fh: HFile;
bf: TBITMAPFILEHEADER;
bh: TBITMAPINFOHEADER;
begin
// код для чтения заголовка BMP файла и получения размеров
end;
PNG
Для PNG изображений размеры также можно определить, прочитав заголовок файла:
procedure GetPNGSize(const sFile: string; var wWidth, wHeight: word);
var
f: TFileStream;
Sig: array[0..7] of byte;
begin
FillChar(Sig, SizeOf(Sig), #0);
f := TFileStream.Create(sFile, fmOpenRead);
try
f.Read(Sig[0], SizeOf(Sig));
if (Sig[0] = $89) and (Sig[1] = $50) and (Sig[2] = $4E) and (Sig[3] = $47) and (Sig[4] = $0D) and (Sig[5] = $0A) and (Sig[6] = $1A) and (Sig[7] = $0A) then
begin
f.Seek(16, 0);
wWidth := ReadMWord(f);
f.Seek(20, 0);
wHeight := ReadMWord(f);
end;
finally
f.Free;
end;
end;
GIF
Для GIF изображений размеры можно определить, прочитав заголовок файла и блок изображений:
procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: word);
var
// код для чтения заголовка GIF файла и получения размеров
end;
Эти примеры кода позволяют быстро определить размеры изображений без необходимости загружать их в память, что может быть полезно для оптимизации производительности, особенно при работе с большими изображениями.
В статье представлены примеры кода для быстрого определения размеров изображений форматов JPEG, BMP, PNG и GIF без их открытия, что полезно для предварительного анализа и оптимизации работы с данными в среде Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS