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

Работа с прозрачными изображениями в Delphi: Извлечение отдельных PNG из одного большого файла

Delphi , Компоненты и Классы , TImage и TImageList

Работа с графическими изображениями в программировании часто требует выполнения различных операций, таких как сохранение, изменение и извлечение отдельных элементов из больших изображений. В данном случае, пользователь столкнулся с задачей извлечения отдельных PNG изображений из одного большого файла, сохраняя при этом прозрачность. Это может быть необходимо, например, при создании пользовательского интерфейса, где элементы меню или инструментов представлены в виде набора иконок, хранящихся внутри одного большого изображения.

Проблема

Пользователь имеет большое PNG изображение (16000x70px с прозрачным фоном), содержащее 50 различных PNG файлов. Необходимо загрузить это изображение и извлечь из него отдельные PNG, сохраняя при этом прозрачность. Попытки загрузки в TImageList и TBitmapArray приводили к потере прозрачности.

Решение

Используя библиотеку PngComponents (для Delphi 2009 и выше), можно воспользоваться компонентом TPngCollection, который позволяет хранить изображения различного размера. Однако, как отметил пользователь, это не решает проблему, так как TPngCollection загружает изображение целиком, а не позволяет извлекать части.

Альтернативный ответ

Пользователь может создать собственную функцию для извлечения изображений, используя базовые возможности Delphi. Например, можно модифицировать существующий код TImageList, увеличив ограничения на размеры изображений или использовать сторонние компоненты, такие как TcxImageList от DevExpress или компоненты от TMS.

Подтвержденный ответ

Используя следующий код, можно извлечь отдельные PNG из большого изображения, сохраняя прозрачность:

type
  TRectArray = array of TRect;
  TBitmapArray = array of TBitmap;

function FixRect(SrcRect: TRect): TRect;
begin
  // Функция для корректировки порядка координат прямоугольника
  // (если левая сторона больше правой или верхняя сторона больше нижней)
end;

function TrimRect(SrcRect: TRect; minx, miny, maxx, maxy: Integer): TRect;
begin
  // Функция для обрезки прямоугольника в рамках заданных ограничений
end;

procedure GetBitmaps(const SrcPNG: TPNGImage; const SrcRects: TRectArray; var DstBitmapArray: TBitmapArray);
var
  i: Integer;
  Rct: TRect;
  Bmp: TBitmap;
begin
  // Создание нового TBitmap и копирование данных из SrcPNG
  Bmp := TBitmap.Create;
  Bmp.Assign(SrcPNG);
  // ...
  // Цикл для извлечения каждого прямоугольника из SrcPNG в отдельный TBitmap
  // Используется функция BitBlt для копирования частей изображения
  // ...
  Bmp.Free;
end;

procedure LoadBitmaps(const SrcPNG: TPNGImage; const Positions: TStrings; var DstBitmapArray: TBitmapArray);
var
  i, l: Integer;
  rectarray: TRectArray;
  tmp: TStringList;
begin
  // ...
  // Создание массива прямоугольников на основе строки Positions
  // ...
  // Вызов функции GetBitmaps для извлечения изображений
  // ...
end;

procedure TForm1.btnExtractClick(Sender: TObject);
var
  src: TPNGImage;
begin
  src := TPNGImage.Create;
  src.Assign(img.Picture.Graphic);
  try
    // ...
    // Инициализация DstBitmapArray и вызов LoadBitmaps для извлечения изображений
    // ...
    // Отображение первого извлеченного изображения в TImage
    // ...
  finally
    FreeAndNil(src);
  end;
end;

Приведенный выше код представляет собой основу для извлечения изображений из большого PNG файла, сохраняя при этом прозрачность. Важно отметить, что код должен быть дополнен и протестирован для корректной работы в конкретном проекте.

Заключение

Для решения задачи извлечения отдельных PNG изображений из одного большого файла с сохранением прозрачности, можно использовать различные подходы, включая сторонние компоненты и собственные функции. Ключевым моментом является правильное копирование изображений с использованием BitBlt и сохранение метаданных прозрачности.

Создано по материалам из источника по ссылке.

Задача заключается в извлечении отдельных PNG изображений из одного большого файла в среде программирования Delphi, при этом важно сохранить прозрачность изображенений.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: TImage и TImageList ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 11:29:37/0.0036149024963379/0