Текущий архив: 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.5 MB
Время: 0.034 c