Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сохранить TBitmap, как TIcon?


Страницы:   1 2

Anderson ©   (2004-08-28 19:34:00) 

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


Anderson   (2004-08-31 18:27:00) [1]

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


Anderson   (2004-08-31 17:05:00) [2]

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


Mihey_temporary   (2004-08-31 16:11:00) [3]


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


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

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


Anderson   (2004-08-31 16:03:00) [4]

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


Anderson   (2004-08-31 15:44:00) [5]

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


Anderson   (2004-08-31 15:27:00) [6]

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


Mihey_temporary   (2004-08-30 23:03:00) [7]

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


Mihey_temporary   (2004-08-30 22:41:00) [8]


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


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


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

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

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

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


Mihey_temporary   (2004-08-30 14:32:00) [10]

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


Mihey_temporary   (2004-08-30 12:30:00) [11]

Я ещё раз говорю, вопрос у человека - как СОХРАНИТЬ иконку. Откройте 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.


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

Преобразование 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-29 21:05:00) [13]

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


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

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

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


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

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


Mihey_temporary   (2004-08-29 18:49:00) [16]


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


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


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

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


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

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


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

[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 16:50:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо