![]() |
|
|
#1
|
|||
|
|||
|
Доброго времени суток. Подскажите плз кто знает, как из TBitmap записать рисунок в *.ico-файл?
|
|
#2
|
||||
|
||||
|
Создай TIcon и перересуй на него твой TBitmap, в сети примеров - выше крыши.
|
|
#3
|
|||
|
|||
|
Дело в том, что TIcon поддерживает только 16 цветов. Т.е. цветность обрезается. А мне нужно делать 32 и 24 битные иконки (в зависимости от наличия альфа-канала).
|
|
#4
|
|||
|
|||
|
Есть API функция CreateIconIndirect
|
|
#5
|
||||
|
||||
|
Нашел тут на просторах своего HD, может поможет
Как создать ICO из BMP -------------------------------------------------------------------------------- Нужно создать два 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; |
|
#6
|
|||
|
|||
|
Imikle, можно поподробнее? Может пример есть?
|
|
#7
|
|||
|
|||
|
cotseec, смотрел такой пример. Здесь Icon типа TIcon. Т.е. когда делаем Icon.Handle := CreateIconIndirect(IconInfo); - у нас иконка получается 16-ти цветная
![]() |
|
#8
|
||||
|
||||
|
посмотри еще вот эти вырезки (приложил к коменту), в свое время пытался сделать то же самое (BMP в ICO), но исходники того, что у меня получилось потерялись безвозвратно
|
|
#9
|
|||
|
|||
|
http://janych.selfip.com/examples/Delphi/Icons/
Посмотри тут, надеюсь поможет |
|
#10
|
|||
|
|||
|
Цитата:
![]() |
|
#11
|
|||
|
|||
|
Я например целый год над этим бился и в конце концов
http://www.softtelecom.ru/algreg.htm часть исходников из Graphic Conveyer 2.5 |
|
#12
|
|||
|
|||
|
Цитата:
Должна получаться truecolor, если битмапы truecolor. Только сохранить в файл эту иконку в Делфи не получится, так как нет там нормальной процедуры сохранения. Можно сохранить иконку так. Там же можно посмотреть, как иконки делаются, можно в конце концов записать иконку в Stream и прочитать оттуда LoadFromStream. Загружаются иконки вроде бы нормально. |