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

Работа с большими изображениями в Delphi: разбиение TBitmapSurface на несколько объектов TBitmap для обработки изображений свыше 8192 пикселей в высоту

Delphi , Графика и Игры , Canvas

Вопрос работы с большими изображениями в 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, можно использовать следующий подход:

  1. Загрузите изображение в TBitmapSurface.
  2. Создайте дополнительные TBitmapSurface и установите их размеры в соответствии с размером частей исходного изображения.
  3. Скопируйте соответствующие части исходного изображения в созданные TBitmapSurface.
  4. Присвойте содержимое каждого 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




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


:: Главная :: Canvas ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 21:59:14/0.0034859180450439/0