Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с изображениями: быстрое определение размеров для JPEG, BMP, PNG и GIF без открытия файла

Delphi , Графика и Игры , Изображения

При работе с изображениями в среде 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Изображения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:47:51/0.0020341873168945/0