Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

Как сохранить 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 вся ветка

Форум: "Media";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.027 c
14-1100149608
Dmitriy O.
2004-11-11 08:06
2004.11.28
Ясир Арафат умер. Официально


1-1100587939
Vilux
2004-11-16 09:52
2004.11.28
Почему программа просто исчезает?


4-1097664899
Дмитрий Ботвин
2004-10-13 14:54
2004.11.28
Экспорт функций


14-1099615084
Кто---то
2004-11-05 03:38
2004.11.28
Где взять структуру tft-шрифта На Дельфи ?


1-1100281342
n-neo
2004-11-12 20:42
2004.11.28
Как придать форме...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский