Работа с большими изображениями в Delphi: разбиение TBitmapSurface на несколько объектов TBitmap для обработки изображений свыше 8192 пикселей в высоту
Вопрос работы с большими изображениями в Delphi может стать серьезной задачей, особенно если речь идет о использовании компонентов TBitmap, которые имеют ограничение в 8192 пикселей по высоте. В таких случаях разработчики сталкиваются с необходимостью разбиения исходного изображения на несколько частей для дальнейшей обработки или отображения. Рассмотрим, как можно решить данную проблему на примере работы с TBitmapSurface и TBitmap из библиотеки FMX.
Проблема
Разработчик столкнулся с необходимостью нарисовать содержимое TBitmapSurface на FMX.Graphics.TBitmap. Он уже загрузил изображение в TBitmapSurface, но поскольку TBitmap не поддерживает размеры более 8192 пикселей по высоте, и его изображение имеет размер 1000x16000 пикселей, ему необходимо разбить его на несколько TBitmap для отображения. В качестве примера загрузки изображения в TBitmapSurface уже существует следующий код:
var
bitmapSurf: TBitmapSurface;
path: string;
begin
path := 'image.jpg';
bitmapSurf := TBitmapSurface.Create;
TBitmapCodecManager.LoadFromFile(path, bitmapSurf);
end;
Решение
Для решения задачи разбиения большого изображения на несколько объектов TBitmap, можно использовать следующий подход:
Загрузите изображение в TBitmapSurface.
Создайте дополнительные TBitmapSurface и установите их размеры в соответствии с размером частей исходного изображения.
Скопируйте соответствующие части исходного изображения в созданные TBitmapSurface.
Присвойте содержимое каждого TBitmapSurface соответствующему TBitmap.
Пример кода для разбиения изображения на две части:
var
src, dst: TBitmapSurface;
path, scan: string;
w, h1, h2: integer;
begin
path := 'C:\tmp\Imgs\res.bmp';
src := TBitmapSurface.Create;
try
TBitmapCodecManager.LoadFromFile(path, src);
dst := TBitmapSurface.Create;
try
// Размер исходного изображения
w := src.Width;
h1 := src.Height div 2;
// Создание первого TBitmap (верхняя половина изображения)
dst.SetSize(w, h1, TPixelFormat.RGBA);
for scan := 0 to h1-1 do
Move(src.Scanline[scan]^, TBitmapSurface(dst).Scanline[scan]^, src.Width * 4);
Image1.Bitmap.Assign(dst);
// Создание второго TBitmap (нижняя половина изображения)
h2 := src.Height - h1;
dst.SetSize(w, h2, TPixelFormat.RGBA);
for scan := h1 to src.Height-1 do
Move(src.Scanline[scan]^, TBitmapSurface(dst).Scanline[scan-h1]^, src.Width * 4);
Image2.Bitmap.Assign(dst);
Image2.Bitmap.Offset := TPointF.Create(0, Float(h1));
finally
dst.Free;
end;
finally
src.Free;
end;
Данный пример показывает, как можно разделить одно большое изображение на две части и отобразить их в разных TBitmap, что позволяет работать с изображениями, превышающими ограничение в 8192 пикселей по высоте.
Заключение
Работа с большими изображениями в Delphi требует особого подхода, особенно когда используются компоненты с ограничениями по размеру. Разбиение изображения на несколько частей — эффективный способ решения этой проблемы. Приведенный пример демонстрирует, как можно реализовать такой подход, используя TBitmapSurface и TBitmap из библиотеки FMX.
Разработчик в Delphi столкнулся с необходимостью разбиения большого изображения на части для обработки и отображения, поскольку `TBitmap` имеет ограничение в 8192 пикселей по высоте.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.