Статья будет посвящена использованию функции Assign для объекта TBitmap32, который является частью библиотеки Graphics32, и рассмотрит проблему сохранения прозрачности изображений при работе с этой функцией в среде разработки Delphi. Напишем статью на русском языке, ориентированную на специалистов, работающих с Object Pascal (Delphi), и приведем примеры кода для лучшего понимания проблемы.
Использование TBitmap32.Assign() в Delphi: сохранение прозрачности изображений с Graphics32
В процессе разработки приложений на Delphi, особенно при работе с графическими элементами, важно понимать особенности использования различных типов битмап-объектов. В данной статье мы рассмотрим проблему, связанную с сохранением прозрачности изображений при использовании объекта TBitmap32 из библиотеки Graphics32.
Проблема
Разработчики часто сталкиваются с ситуацией, когда после присвоения изображения объекту TBitmap32, используя метод Assign, прозрачность исходного изображения теряется. Это может быть вызвано особенностями реализации метода Assign в библиотеке Graphics32 или неправильным использованием данной функции.
Пример кода
procedure TForm1.Button8Click(Sender: TObject);
var
bmp32: TBitmap32;
bmp: TBitmap;
wic: TWICImage;
begin
bmp32 := TBitmap32.Create(TMemoryBackend);
bmp := TBitmap.Create;
wic := TWICImage.Create;
try
wic.LoadFromFile('overlay.png'); // прозрачное изображение
bmp32.Assign(wic); // присваивание изображения объекту TBitmap32
bmp32.SaveToFile('BMP32.bmp'); // сохраненное изображение не прозрачно
img1.Bitmap.Assign(bmp32);
bmp.Assign(wic); // присваивание того же изображения объекту TBitmap
bmp.SaveToFile('BMP.bmp'); // сохраненное изображение прозрачное
img2.Bitmap.Assign(bmp);
finally
wic.Free;
bmp32.Free;
bmp.Free;
end;
end;
Как видно из примера, при использовании TBitmap прозрачность сохраняется, в то время как с TBitmap32 - теряется.
Возможные причины проблемы
Ошибка в библиотеке Graphics32 (используется последняя версия с GitHub)
Ошибка в классе TWICImage
Ошибка в компиляторе Delphi 10.2.3
Неправильное использование методов и свойств объектов
Подтвержденное решение
Разработчику удалось найти решение проблемы, добавив несколько строк к модулю Graphics32. Внутри процедуры AssignFromGraphic класса TCustomBitmap32 были внесены изменения:
procedure AssignFromGraphic(TargetBitmap: TCustomBitmap32; SrcGraphic: TGraphic);
begin
// ... существующий код ...
//--- начало исправления
else if (SrcGraphic is TWICImage) and (TWICImage(SrcGraphic).ImageFormat = wifPng) then
AssignFromGraphicPlain(TargetBitmap, SrcGraphic, $00FFFFFF, False);
//--- конец исправления
// ... существующий код ...
end;
Также были изменены параметры процедуры AssignFromGraphicPlain, что позволило сохранить прозрачность исходного PNG-изображения.
Альтернативный ответ и дополнительные соображения
Возможно, существует другой способ решения проблемы без изменения исходного кода библиотеки Graphics32. Стоит обратить внимание на возможные обновления библиотеки или консультации с ее разработчиками для получения более авторитетных рекомендаций.
Заключение
В данной статье мы рассмотрели проблему потери прозрачности изображений при использовании TBitmap32.Assign(), а также предложили решение, основанное на изменении исходного кода библиотеки Graphics32. Разработчикам, работающим с графикой в Delphi, важно быть осведомленными о подобных нюансах и уметь их решать для обеспечения корректной работы приложений.
Статья предназначена для специалистов, знакомых с Object Pascal и библиотеками Graphics32, и может служить полезным руководством при работе с битмап-изображениями в Delphi.
Анализ кода в программной среде Delphi для обеспечения сохранения прозрачности изображений после использования функции `Assign` объекта класса `TBitmap32` из библиотеки Graphics32.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.