type
TImageSize = record
Width: Integer;
Height: Integer;
end;
function ReadGIFSize(Stream: TStream): TImageSize;
type
TGifHeader = record
Signature: array [0..5] of Char;
Width, Height: Word;
end;
var
Header: TGifHeader;
begin
FillChar(Header, SizeOf(TGifHeader), #0);
Result.Width := -1;
Result.Height := -1;
with Stream dobegin
Seek(0, soFromBeginning);
ReadBuffer(Header, SizeOf(TGifHeader));
end;
if (AnsiUpperCase(Header.Signature) = 'GIF89A') or
(AnsiUpperCase(Header.Signature) = 'GIF87A') thenbegin
Result.Width := Header.Width;
Result.Height := Header.Height;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
FileName = 'D:\test.gif';
var
fs: TFileStream;
gifsize: TImageSize;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
gifsize := ReadGIFSize(fs);
ShowMessage(Format('Breite %d Hцhe %d', [gifsize.Width, gifsize.Height]));
finally
fs.Free;
end;
end;
Перевод контента на русский язык:
Это код Delphi, который читает размер файла GIF-изображения с помощью функции ReadGIFSize и отображает его в сообщении.
Разбивка кода:
Определен тип записи TImageSize, которая имеет два целочисленных поля: Width и Height.
Функция ReadGIFSize принимает объект TStream (который представляет собой файл GIF) в качестве входного параметра и возвращает запись TImageSize.
В функции:
Локальная переменная Header типа TGifHeader объявляется и инициализируется нулями с помощью FillChar.
Поле результата функции устанавливаются в -1, указывая, что размер не был прочитан еще.
Входной поток перемещается к началу с помощью Seek, а затем метод ReadBuffer используется для чтения заголовка GIF в переменную Header.
Если сигнатура заголовка GIF совпадает с 'GIF89A' или 'GIF87A', функция устанавливает поля результата в значения, хранящиеся в поле Width и Height заголовка.
В процедуре Button1Click:
Определен константа FileName, указывающая на файл GIF.
Создается объект TFileStreamfs для чтения файла.
Функция ReadGIFSize вызывается с fs в качестве входного параметра и результат хранится в локальной переменной gifsize.
Показано сообщение, отображающее ширину и высоту GIF-изображения, форматированное с помощью Format.
Альтернативное решение:
Вместо чтения заголовка GIF вручную можно использовать компонент TImageList или третьестороннюю библиотеку, которая предоставляет функциональность для чтения и манипуляции файлами GIF. Это упрощает код и делает его более надежным.
Например, можно использовать метод ReadGIF компонента TImageList для прямого чтения размера изображения:
В этом коде создается временный объект TImageList, загружается файл GIF с помощью метода LoadFromFile и отображается ширина и высота изображения в сообщении. Объект TImageList освобождается, когда он больше не нужен, чтобы избежать утечек памяти.
Статья описывает функцию ReadGIFSize для чтения размера GIF-картинки из потока и ее применение в приложении Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.