Нужно создать два bitmap'а: bitmap-маску ("AND" bitmap) и bitmap-картинку (XOR bitmap). Потом передать дескрипторы "AND" и "XOR" bitmap-ов API функции CreateIconIndirect():
procedure TForm1.Button1Click(Sender: TObject);
var
IconSizeX: integer;
IconSizeY: integer;
AndMask: TBitmap;
XOrMask: TBitmap;
IconInfo: TIconInfo;
Icon: TIcon;
begin{Get the icon size}
IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);
{Create the "And" mask}
AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;
{Draw on the "And" mask}
AndMask.Canvas.Brush.Color := clWhite;
AndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));
AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);
{Draw as a test}
Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);
{Create the "XOr" mask}
XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;
{Draw on the "XOr" mask}
XOrMask.Canvas.Brush.Color := ClBlack;
XOrMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));
XOrMask.Canvas.Pen.Color := clRed;
XOrMask.Canvas.Brush.Color := clRed;
XOrMask.Canvas.Ellipse(4, 4, IconSizeX - 4, IconSizeY - 4);
{Draw as a test}
Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);
{Create a icon}
Icon := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Icon.Handle := CreateIconIndirect(IconInfo);
{Destroy the temporary bitmaps}
AndMask.Free;
XOrMask.Free;
{Draw as a test}
Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, Icon);
{Assign the application icon}
Application.Icon := Icon;
{Force a repaint}
InvalidateRect(Application.Handle, nil, true);
{Free the icon}
Icon.Free;
end;
Программный код на Delphi, который создает иконку (ICO) из растровой картинки (BMP). Код создает два растра: AndMask (AND- маска) и XOrMask (XOR- маска). Затем он использует эти маски для создания иконки с помощью функции API CreateIconIndirect.
Обзор кода:
Получение размера системной иконки из функции GetSystemMetrics.
Создание двух растров: AndMask и XOrMask. AndMask устанавливается в режим монохромного цвета.
Нарисовка белого прямоугольника на AndMask, а затем эллипса (круга) с черной кистью. Это создает маску для прозрачных областей иконки.
Нарисовка красной эллипсы на XOrMask в качестве теста.
Создание иконки с помощью функции API CreateIconIndirect. Он передает handles двух растров, а также другие информацию, такие как координаты горячих точек и цвета масок.
Уничтожение временных растров.
Присвоение новой иконке свойству иконки приложения.
Форсирование обновления окна приложения.
Обратите внимание, что этот код использует класс TBitmap Delphi для работы с растрами, а также класс TIcon для создания иконок. Функция API CreateIconIndirect создает иконку из параметров.
Некоторые предложения по улучшению кода:
Вместо жесткого кодирования размера иконки рассмотрите более гибкий подход, например, получение размера иконки из системных настроек.
Рассмотрите использование более эффективного метода создания масок растров. Например, вы можете использовать одиночный экземпляр класса TBitmap и установить режим монохромного цвета для создания обеих масок одновременно.
Вместо нарисовки тестовых паттернов на растрах рассмотрите добавление логирования или вывода отладочной информации, чтобы убедиться в том, что процесс создания иконки работает как ожидается.
В целом, этот код предоставляет хороший старт для создания ICO из BMP-картинки. С некоторыми изменениями и улучшениями он может быть сделан более эффективным и надежным.
Создать ICO из BMP можно путем создания двух bitmap-ов: маски ("AND" bitmap) и картинки (XOR bitmap), а затем передачи дескрипторов этих bitmap в API-функцию CreateIconIndirect().
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.