При разработке приложений с использованием технологий Delphi и, в частности, FMX (FireMonkey), разработчики часто сталкиваются с необходимостью работы с крупноформатными изображениями. Одной из проблем, с которой сталкиваются пользователи, является ограничение размера изображения в компоненте TBitmap, которое не позволяет загружать изображения размером более 8192x8192 пикселей. Это может быть критичным, например, при создании просмотрщика комиксов (манги), где изображения могут достигать размеров 1000x16000 пикселей.
Проблема
Разработчик столкнулся с проблемой загрузки изображений в формате JPG с большими размерами в приложении на Delphi FMX. Использование стандартных компонентов, таких как TImage, TImageViewer, TImageControl, приводило к тому, что изображения обрезались до размеров 8192x8192 пикселей после загрузки. Попытки найти сторонние библиотеки для работы с изображениями в FMX также не увенчались успехом.
Решение
Ключ к решению проблемы кроется в использовании класса TBitmapSurface, который не имеет ограничений TBitmap и позволяет загружать изображения без обрезки. Однако, возникает вопрос: как передать изображение из TBitmapSurface в TImage, не потеряв при этом качество и размер?
Подход с использованием TBitmapSurface
Для работы с крупноформатными изображениями можно использовать класс TBitmapSurface, который позволяет загружать изображения большего размера, чем ограничения TBitmap. Пример кода для загрузки изображения в TBitmapSurface выглядит следующим образом:
var
srce: TBitmapSurface;
path: string;
begin
path := 'путь_к_изображению';
srce := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, srce);
// Дальнейшие действия с изображением
end;
Разделение изображения
Чтобы отобразить крупноформатное изображение, его можно разделить на части, каждая из которых будет отображаться в отдельном TBitmap. Пример кода для разделения изображения на две части:
var
srce, dest: TBitmapSurface;
path: string;
scan, w, h1, h2: Integer;
begin
path := 'путь_к_изображению';
srce := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, srce);
dest := TBitmapSurface.Create;
// Задаем ширину и высоту для первой половины изображения
w := srce.Width;
h1 := srce.Height div 2;
dest.SetSize(w, h1, TPixelFormat.RGBA);
// Копируем пиксели из первой половины изображения
for scan := 0 to h1-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan]^, srce.Width * 4);
// Присваиваем первую половину изображения компоненту Image1
Image1.Bitmap.Assign(dest);
// Повторяем процесс для второй половины изображения
h2 := srce.Height - h1;
dest.SetSize(w, h2, TPixelFormat.RGBA);
for scan := h1 to srce.Height-1 do
Move(srce.Scanline[scan]^, TBitmapSurface(dest).Scanline[scan-h1]^, srce.Width * 4);
// Присваиваем вторую половину изображения компоненту Image2
Image2.Bitmap.Assign(dest);
end;
Важные замечания
При работе с крупноформатными изображениями важно учитывать ограничения памяти устройства, на котором будет работать приложение.
Использование TBitmapSurface позволяет обойти ограничения TBitmap, но для отображения изображения в TImage может потребоваться дополнительная обработка.
Разделение изображения на части позволяет отображать его по частям, что может быть полезно для экономии памяти, особенно при работе на устройствах с ограниченными ресурсами.
Заключение
В данной статье был рассмотрен подход к работе с крупноформатными изображениями в Delphi FMX, используя класс TBitmapSurface для обхода ограничений TBitmap. Приведенный пример кода демонстрирует, как загрузить и разделить изображение на части для отображения в компонентах TImage. Это решение позволяет разработчикам создавать приложения, способные работать с изображениями больших размеров, что особенно важно для специализированных приложений, таких как просмотрщики комиксов.
Разработчик столкнулся с необходимостью работы с крупноформатными изображениями в Delphi FMX, обходя ограничения компонента TBitmap, чтобы корректно отображать изображения размером более 8192x8192 пикселей.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.