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

Как создать BMP из ICO 2

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

Как создать BMP из ICO 2

Способ преобразования изображения размером 32x32 в иконку.


unit main;

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls, StdCtrls;

type

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var

  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  winDC, srcdc, destdc: HDC;

  oldBitmap: HBitmap;
  iinfo: TICONINFO;
begin

  GetIconInfo(Image1.Picture.Icon.Handle, iinfo);

  WinDC := getDC(handle);
  srcDC := CreateCompatibleDC(WinDC);
  destDC := CreateCompatibleDC(WinDC);
  oldBitmap := SelectObject(destDC, iinfo.hbmColor);
  oldBitmap := SelectObject(srcDC, iinfo.hbmMask);

  BitBlt(destdc, 0, 0, Image1.picture.icon.width,
    Image1.picture.icon.height,
    srcdc, 0, 0, SRCPAINT);
  Image2.picture.bitmap.handle := SelectObject(destDC, oldBitmap);
  DeleteDC(destDC);
  DeleteDC(srcDC);
  DeleteDC(WinDC);

  image2.Picture.Bitmap.savetofile(ExtractFilePath(Application.ExeName)
    + 'myfile.bmp');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  image1.picture.icon.loadfromfile('c:\myicon.ico');
end;

end.

Программный код на Delphi для конвертации файла ICO в файл BMP:

Создание формы Процедура FormCreate вызывается при создании формы. Она загружает файл ICO с именем "myicon.ico" из директории, где находится исполняемый файл, в изображение (Image1).

Событие клика кнопки Процедура Button1Click вызывается при клике кнопки. Она выполняет следующие шаги:

  1. Получает структуру ICONINFO для загруженного файла ICO с помощью GetIconInfo.
  2. Создает три устройства контекста (DC): окно DC, источник DC и целевой DC.
  3. Выбирает цветную картинку и маску из файла ICO в целевой DC и источнике DC соответственно.
  4. Использует BitBlt для копирования маски на цветную картинку в целевом DC.
  5. Сохраняет полученный BMP-изображение в файле "myfile.bmp" в той же директории, где находится исполняемый файл.

Предложения по улучшению кода Вот несколько предложений для улучшения кода:

  1. Используйте SysUtils.GetEnvironmentVariable('USERPROFILE') вместо жесткого пути к файлу ICO.
  2. Используйте TPath.Combine для объединения директории исполняемого файла с именем и расширением файла.
  3. Рассмотрите использование более robust механизма обработки ошибок, например, попытка загрузить файл ICO и отображение сообщения об ошибке, если это не удается.
  4. Можете упростить создание DC, используя CreateCompatibleDC только один раз и повторно используя его для обоих источника и целевого DC.

Альтернативное решение Вот альтернативный способ конвертации файла ICO в файл BMP:

  1. Загружает файл ICO в объект TBitmap с помощью LoadFromStream.
  2. Создает новый объект TBitmap с желаемыми размерами.
  3. Использует Canvas.Draw для рисования ICO-изображения на новом bitmap, масштабируя его, если необходимо.

Пример реализации:

procedure TForm1.Button1Click(Sender: TObject);
var
  bmi: TBitmapInfo;
  pbi: PBitmapInfo;
  hbmColor, hbmMask: HBITMAP;
  hdcMem, hdcScreen: HDC;
begin
  Image1.Picture.Icon.LoadFromFile('c:\myicon.ico');

  bmi := BitmapInfo;
  GetObject(Image1.Picture.Bitmap.Handle, SizeOf(TBitmapInfo), @bmi);
  pbi := @bmi;

  hbmColor := CreateBitmapIndirect(pbi);
  hbmMask := CreateBitmapIndirect(pbi);

  hdcMem := CreateCompatibleDC(hdcScreen, 0, 0, pbi.bmWidth, pbi.bmHeight, 0);
  hdcScreen := GetDC(0);

  SelectObject(hdcMem, hbmColor);
  BitBlt(hdcMem, 0, 0, pbi.bmWidth, pbi.bmHeight, hdcScreen, 0, 0, SRCPAINT);
  SelectObject(hdcMem, hbmMask);
  BitBlt(hdcMem, 0, 0, pbi.bmWidth, pbi.bmHeight, hdcScreen, 0, 0, SRCPAINT);

  Image2.Picture.Bitmap.Handle := CreateBitmapFromMemory(hdcMem, pbi.bmWidth, pbi.bmHeight);
  DeleteObject(hbmColor);
  DeleteObject(hbmMask);
  DeleteDC(hdcMem);
  ReleaseDC(0, hdcScreen);

  Image2.Picture.Bitmap.SaveToFile(ExtractFilePath(Application.ExeName) + 'myfile.bmp');
end;

В этом коде используется структура BitmapInfo для получения информации о битмапе ICO и создания нового bitmap с теми же размерами. Затем используются BitBlt для копирования цветной картинки и маски на новый bitmap, масштабируя их, если необходимо. Наконец, сохраняется полученное BMP-изображение в файле "myfile.bmp" в той же директории, где находится исполняемый файл.

В статье описывается способ конвертации иконки размером 32x32 в растровое изображение BMP с помощью Delphi-приложения, использующего WinAPI-функции для преобразования иконки в битмапку.


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

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




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


:: Главная :: Bitmap ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 00:04:26/0.0034780502319336/1