В статье будет рассмотрено решение проблемы с использованием функции TBitmap32.LoadFromStream(), которая предназначена для загрузки изображений непосредственно из потока данных. При этом, согласно предоставленному контексту, проблема заключается в том, что при использовании этой функции возникает исключение EInvalidGraphic, указывающее на то, что загружаемое изображение не является действительным. Это происходит, поскольку функция TBitmap32.LoadFromStream() предназначена для работы только с изображениями в формате Windows bitmap и не может автоматически определять формат изображения в потоке данных.
Оригинальный заголовок:
TBitmap32.LoadFromStream() Auto-Recognize Image Format
Введение
В современных приложениях, разработанных с использованием Delphi, часто возникает необходимость загрузки изображений из различных источников. Одним из популярных компонентов для работы с изображениями является TBitmap32, который предоставляет множество возможностей по обработке графической информации.
Проблема
Пользователь столкнулся с проблемой при попытке использовать функцию LoadFromStream() класса TBitmap32. При загрузке изображений из потока данных возникает исключение, указывающее на недействительность изображения. Это связано с тем, что функция ожидает формат Windows bitmap (BMP), который имеет уникальную сигнатуру в начале файла.
Контекст
В контексте обсуждения представлен код, который демонстрирует проблему:
uses GR32, GifImg, PngImage, Vcl.Graphics;
var
pic: TBitmap32;
bs: TBytesStream;
begin
bs := TBytesStream.Create(TClientDataSet(cds).FieldByName('filedata').AsBytes);
try
pic := TBitmap32.Create;
try
pic.LoadFromStream(bs); // <- EInvalidGraphic exception
// ... дальнейшие действия с 'pic'
finally
FreeAndNil(pic);
end;
finally
FreeAndNil(bs);
end;
end;
Работа вокруг проблемы (Workaround)
Пользователь обнаружил, что если загрузить изображение на диск и затем использовать функцию LoadFromFile(), то проблема решается. Это работает потому, что функция LoadFromFile() в своем реализации проверяет сигнатуру файла и в случае необходимости использует промежуточный объект для загрузки изображения.
Также упоминается альтернативный подход с использованием специализированных классов (например, TPNGImage, TJPEGImage), которые могут загрузить изображение из потока данных и затем присвоить его объекту TBitmap32 через метод Assign().
Подтвержденное решение
В контексте обсуждения приводится код функции LoadFromFile(), который демонстрирует проверку сигнатуры файла на соответствие формату Windows bitmap. Если сигнатура не соответствует, используется промежуточный объект TPicture для загрузки изображения.
procedure TCustomBitmap32.LoadFromFile(const FileName: string);
begin
// ... код проверки и загрузки файла ...
end;
Важно понимать, что функция LoadFromStream() в классе TBitmap32 не поддерживает автоматическое определение формата изображения. Это означает, что для работы с различными форматами изображений необходимо использовать промежуточные объекты.
Альтернативное решение
В качестве альтернативы можно использовать класс TWICImage, который поддерживает множество форматов изображений и может автоматически определить тип загружаемого изображения. После загрузки из потока данных, изображение можно присвоить объекту TBitmap32.
uses GR32, Vcl.Graphics;
var
pic: TBitmap32;
wic: TWICImage;
bs: TBytesStream;
begin
// ... создание потока данных 'bs' ...
pic := TBitmap32.Create;
try
wic := TWICImage.Create;
try
bs.Position := 0;
wic.LoadFromStream(bs);
pic.Assign(wic);
finally
FreeAndNil(wic);
end;
finally
FreeAndNil(pic);
end;
// ... дальнейшие действия с 'pic' ...
end;
Заключение
В статье было рассмотрено, что для корректной работы с различными форматами изображений в компоненте TBitmap32 необходимо использовать промежуточные объекты или классы, поддерживающие автоматическое определение формата изображения. Это позволяет разработчикам избегать ошибок при загрузке изображений и обеспечивает гибкость в работе с графическими данными.
Примечания
Следует отметить, что использование промежуточных объектов может потребовать дополнительных ресурсов и времени на выполнение операций. В некоторых случаях это может быть несущественным, но в приложениях, требующих высокой производительности, стоит учитывать этот фактор.
Статья предназначена для разработчиков, использующих Delphi XE2 или более поздние версии, а также компоненты GR32 и Vcl.Graphics. Приведенные примеры кода на Object Pascal (Delphi) могут быть использованы в качестве отправной точки для решения аналогичных задач.
Функция `TBitmap32.LoadFromStream()` предназначена для загрузки изображений из потока данных, но вызывает исключение при некорректном формате изображения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.