Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Как сохранить TBitmap, как TIcon?   Найти похожие ветки 

 
Anderson   (2004-08-28 19:34) [0]

Короче, сохраняю TBitmap"ки в TIcon"ки. Расширение меняется, но фактически они сохраняются, как TBitmap - это доказывает хотя бы то, что фон у этих иконок становится черным и его нельзя изменить, хотя, опять-таки подчеркиваю, расширение меняется.


 
Mihey_temporary ©   (2004-08-28 21:11) [1]

Естессно, иконка же состоит из XOR и AND масок, поэтому сохранённое изображение не совсем иконка :). Думаю, радость по поводу найденного споосба была преждевременной.

http://bdn.borland.com/article/0,1410,17748,00.html

После чего TIcon.SaveToFile сохранит настоящую иконку (естественно, 16 цветов, не больше (точно для Delphi 5)).


 
grom   (2004-08-29 15:58) [2]

берём ImageList засовываем TBitmap
вытаскиваем TIcon


 
Anderson   (2004-08-29 16:50) [3]

Естессно, иконка же состоит из XOR и AND масок
Млин, хоть убейте, а что такое XOR и AND маски я не понимаю. Если не затруднит, то может объясните? :)


 
Anderson   (2004-08-29 18:00) [4]

[code]procedure TForm1.FormCreate(Sender: TObject);
var
IconSizeX : integer;
IconSizeY : integer;
AndMask : TBitmap;
XOrMask : TBitmap;
IconInfo : TIconInfo;
Icon : TIcon;
begin

IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);

AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;

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);

XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;

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);

Icon := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Icon.Handle := ExtractIcon(HInstance, "D:\Program Files\Borland\Delphi6\Projects\IconGrabber\sys_winxp.icl",22);

AndMask.Free;
XOrMask.Free;

Image1.Canvas.Draw(0, 0, Icon);
Image1.Picture.SaveToFile("d:\FUCK.ico");

end;

end.
[/code]

Мля, да они всё равно сохраняются как bitmap"ки. В чем ошибка-то?


 
Anderson   (2004-08-29 18:05) [5]

Может, я, конечно, тупой, но зачем писать этот код, если проблема не решается: либо иконка сохраняется как bitmap, либо, опять-таки-же, в 16-цветном режиме (Icon.SaveToFile("blablabla.ico"))


 
Anderson   (2004-08-29 18:40) [6]

Млин, я не прочитал полностью пост Mihey"а...всё понял :_


 
Mihey_temporary ©   (2004-08-29 18:49) [7]


> Млин, хоть убейте, а что такое XOR и AND маски я не понимаю.
> Если не затруднит, то может объясните? :)


XORMask - изображение иконки, ANDMask - двухцветное изображение, содержащее маску прозрачности.


 
Anderson   (2004-08-29 20:33) [8]

А ты сохранение доделал?


 
Anderson   (2004-08-29 20:42) [9]

В своем первом посте я упомянул про то, что фон становится черным. А как его изменить? Пока приложение работает фон вообще clSilver"овский, а вот после сохранения почему-то черный.

P.S. Меня эти иконки уже достали!...:((( (крик души)


 
Mihey_temporary ©   (2004-08-29 21:05) [10]

Сохранение я доделал почти. На одиночных иконках работает. В "Основной" есть мой пост, там есть новая версия IconLoad.


 
вася   (2004-08-30 08:29) [11]

Преобразование ICO в BMP и обратно
-----------------------------------
Чтобы преобразовать Icon в Bitmap используйте TImageList. для обратного преобразования замените метод AddIcon на Add, и метод GetBitmap на GetIcon

function Icon2Bitmap(Icon: TIcon): TBitmap;
begin
with TImageList.Create (nil) do begin
AddIcon (Icon);
Result := TBitmap.Create;
GetBitmap (0, Result);
Free;
end;
end;
----------------------------------------------------------
Перевод из BitMap в Icon
-------------------------
...(Ваша старая программа вроде не работает) Нужно создать два bitmap, маску (называемую "AND") и bitmap с картинкой (называемый "XOR" bitmap). Можно передать handles к "AND" и "XOR" bitmap Windows API функции CreateIconIndirect() ииспользовать полученный handle иконки в вашем приложении

procedure TForm1.Button1Click(Sender: TObject);
var

IconSizeX : integer;
IconSizeY : integer;
AndMask : TBitmap;
XOrMask : TBitmap;
IconInfo : TIconInfo;
Icon : TIcon;
begin
{Получаем размеры иконки}
IconSizeX := GetSystemMetrics(SM_CXICON);
IconSizeY := GetSystemMetrics(SM_CYICON);

{создаем маску "And"}
AndMask := TBitmap.Create;
AndMask.Monochrome := true;
AndMask.Width := IconSizeX;
AndMask.Height := IconSizeY;

{рисуем на маске "And"}
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);

{Рисуем для проверки}
Form1.Canvas.Draw(IconSizeX * 2, IconSizeY, AndMask);

{Создаем маску "XOr"}
XOrMask := TBitmap.Create;
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;

{Рисуем на маске "XOr"}
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);

{Рисуем для проверки}
Form1.Canvas.Draw(IconSizeX * 4, IconSizeY, XOrMask);

{Создаем иконку}
Icon := TIcon.Create;
IconInfo.fIcon := true;
IconInfo.xHotspot := 0;
IconInfo.yHotspot := 0;
IconInfo.hbmMask := AndMask.Handle;
IconInfo.hbmColor := XOrMask.Handle;
Icon.Handle := CreateIconIndirect(IconInfo);

{Удаляем временные bitmap}
AndMask.Free;
XOrMask.Free;

{Рисуем для проверки}
Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, Icon);

{Присвамваем иконку приложению}
Application.Icon := Icon;

{Заставляем перерисоваться}
InvalidateRect(Application.Handle, nil, true);

{Освобождаем иконку}
Icon.Free;
end;

Валентин Озеров  "Советы по Delphi".


 
Mihey_temporary ©   (2004-08-30 12:30) [12]

Я ещё раз говорю, вопрос у человека - как СОХРАНИТЬ иконку. Откройте Graphics.pas и посмотрите реализацию Graphics.pas:


procedure WriteIcon(Stream: TStream; Icon: HICON; WriteLength: Boolean);
var
 IconInfo: TIconInfo;
 MonoInfoSize, ColorInfoSize: DWORD;
 MonoBitsSize, ColorBitsSize: DWORD;
 MonoInfo, MonoBits, ColorInfo, ColorBits: Pointer;
 CI: TCursorOrIcon;
 List: TIconRec;
 Length: Longint;
begin
 FillChar(CI, SizeOf(CI), 0);
 FillChar(List, SizeOf(List), 0);
 CheckBool(GetIconInfo(Icon, IconInfo));
 try
   InternalGetDIBSizes(IconInfo.hbmMask, MonoInfoSize, MonoBitsSize, 2);
   InternalGetDIBSizes(IconInfo.hbmColor, ColorInfoSize, ColorBitsSize, 16);
...


16 - это 16 цветов! Только так может сохранять TIcon.SaveToFile.


 
Mihey_temporary ©   (2004-08-30 14:32) [13]

С божьей помощью MBo получалась какая-никакая рабочая версия загрузки и сохранения иконок:
http://www.hot.ee/mvps8/IconLoad.zip


 
Anderson   (2004-08-30 16:53) [14]

2 Вася
Васечка, дорогой, не надо приводить цитаты из книжки Валентина Озерова - я её перерыл полностью, и не нашел нужного мне. Прав был Mihey: мне нужно узнать, как сохранить иконку в 256-цветном режиме или выше, а мне дали инфу о том, как перевести Bitmap в Icon и обратно. :)

2 Mihey
Прогу ещё не качал. Чичас посмотрю.
А что такое МВо?

P.S. Кстати, может борландовцам письмецо отправить, чтобы они что-нибудь со своим детищем сделали, а именно позволили сохранять иконки с приемлимой, для сегодняшнего дня, глубиной цвета? :)


 
Mihey_temporary ©   (2004-08-30 22:41) [15]


> А что такое МВо?


О... Не что, а кто. Пожалуй, самый умный чувак, который иногда околачивается в конференции Media.


 
Mihey_temporary ©   (2004-08-30 23:03) [16]

Кстати, в Botland писать, думаю, не стоит. ИМХО это осталось ещё со времён Windows 3.1. Точно так же обстоят дела, например, в Visual Basic.


 
Anderson ©   (2004-08-31 15:27) [17]

<quote>О... Не что, а кто. Пожалуй, самый умный чувак, который иногда околачивается в конференции Media.</quote>
Это уже не чувак, это - взрослый дядя, которому скоро 40 лет стукнет. :)


 
Anderson ©   (2004-08-31 15:44) [18]

Вопрос родился: а нельзя ли для Bitmap"ок маску прозрачности делать?


 
Anderson ©   (2004-08-31 16:03) [19]

Я имею ввиду, чтобы после сохранения часть битмапки была прозрачной, как у ICon"kи.


 
Mihey_temporary ©   (2004-08-31 16:11) [20]


> Я имею ввиду, чтобы после сохранения часть битмапки была
> прозрачной, как у ICon"kи.


Ты штамупешь один вопрос за другим, не оглядываясь назад. А если оглянулся и рассмотрел, например, тот код с загрузкой и сохранением иконок, то увидел бы как ведётся работа с 32-битными иконками.

Ответ: можно, используй 32-битные bitmap"ы.


 
Anderson ©   (2004-08-31 17:05) [21]

Нуб я в графике, вот и штампую вопросы...нуб...а научиться страсть как охота...


 
Anderson ©   (2004-08-31 18:27) [22]

http://forum.vingrad.ru/index.php?showtopic=21183



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
1-1100116011
Neiron
2004-11-10 22:46
2004.11.28
Пакер для Portable Executable на Delphi


6-1095462159
Comp
2004-09-18 03:02
2004.11.28
Трафик


4-1097760226
Дядя
2004-10-14 17:23
2004.11.28
Срочно - надо заблокировать клаву и мышь, Но


1-1100160098
sluge
2004-11-11 11:01
2004.11.28
zlib-несовместимость


1-1100293566
Димон
2004-11-13 00:06
2004.11.28
Как с помощью TStream вести лог?