Текущий архив: 2004.12.05;
Скачать: CL | DM;
ВнизСоздание ICO из BMP с прозрачным фоном Найти похожие ветки
← →
Ольга (2004-09-01 12:36) [0]Здравствуйте!
Подскажите, пожалуйста, можно ли в Дельфи создать из BMP-файла файл ICO С ПРОЗРАЧНЫМ ФОНОМ? ICO из BMP я сделала, а вот установить прозрачный фон у иконки никак не получается, т.е. мне нужно, чтоб прозрачный фон был уже "зашит" в файле ICO.
← →
grom (2004-09-01 13:28) [1]Mожет Image Editor подойдёт
← →
Anderson © (2004-09-01 13:29) [2]Во-во! Я тоже никак не могу это сделать. Кто ответит (легким способом) - тот будет просто героем в моих глазах. :-)
← →
grom (2004-09-01 13:54) [3]программно можно так
procedure TForm1.Button1Click(Sender: TObject);
var
iml:TImageList;
begin
iml:=TImageList.CreateSize(32,32);
Iml.AddMasked(Image1.Picture.Bitmap,clWhite);
Iml.GetIcon(0,Image2.Picture.Icon);
Image2.Picture.SaveToFile("1.ico");
iml.Free;
end;
← →
Anderson © (2004-09-01 14:20) [4]Не катит. Девушка имела не то ввиду. Вот, допустим, загружаешь ты в TImage картинку: например, машина на черном фоне. Она хочет убрать этот фон и сохранить эту BMP"шку, как иконку. Это значит, что, если, допустим, в Image1 находится эта картинка, то при вызывании
Image1.Picture.Bitmap.SaveToFile("d:\icon.ico")
в файл сохранялась иконка без заднего фона и БЕЗ потери цветового качества. У девушки эта иконка сохраняется БЕЗ потери качества, но фон остается, а её нужно от него избавиться.
Ольга, не обижайтесь, я воспользуюсь вашим вопросом на другом форуме. Не охота переписывать все своими словами - просто скопиру, ОК?
← →
Ольга (2004-09-01 14:22) [5]а в чем изюминка?
в Iml.AddMasked(Image1.Picture.Bitmap,clWhite); ?
так ни фига! фон как был розовым, так и остался!
и плюс к тому ругается на Invalid image size
← →
Anderson © (2004-09-01 14:24) [6]Вот-вот! Фон-то остается непрозрачным...а ошибка у меня не выскакивала...
← →
Ольга (2004-09-01 14:24) [7]Конечно, Anderson © , я не против.
← →
Anderson © (2004-09-01 14:25) [8]Поправлю себя: фон остается непрозрачным даже если пишешь:
Iml.AddMasked(Image1.Picture.Bitmap,clРоховый\синий\или серо-буро-малиновый);
← →
Mihey_temporary © (2004-09-01 17:16) [9]2 Ольга:
http://delphimaster.net/view/8-1093707276/
там даже 2 решения
← →
Mihey_temporary © (2004-09-01 17:24) [10]2 Anderson:
Я не понимаю, ты ещё не сохранил?
Не катит. Девушка имела не то ввиду. Вот, допустим, загружаешь ты в TImage картинку: например, машина на черном фоне. Она хочет убрать этот фон и сохранить эту BMP"шку, как иконку. Это значит, что, если, допустим, в Image1 находится эта картинка, то при вызывании Image1.Picture.Bitmap.SaveToFile("d:\icon.ico") в файл сохранялась иконка без заднего фона и БЕЗ потери цветового качества. У девушки эта иконка сохраняется БЕЗ потери качества, но фон остается, а её нужно от него избавиться.
На самом деле это смешно и ты сам не понимаешь, что творишь.
Объясняю. Код...Image1.Picture.Bitmap.SaveToFile("d:\icon.ico")
... сохраняет именно BMP файл с расширением .ICO. Это не настоящая иконка! Просто Windows умеет считывать данные битмапа и представлять их как иконку. Но стоит открыть этот файл с помощью Irfan View, например, как программа скажет, что это на самом деле BMP, а не ICO. Делая так ты никогда не получишь полноценный иконок.
Кстати, Win 98 у меня принимает белый цвет за прозрачный в таком случае, т.е. вполне можно создать прозрачную иконку. Но не надо так!!!
← →
Ольга (2004-09-01 17:44) [11]читала я предыдущую дискуссию на эту тему
можете, кокретней указать, какие два решения там есть?
пыталась переделать под себя борландовский примерчик - не понимаю я, как внедрить туда уже имеющийся файл ICO? ну или проще говоря имеющийся tImage или tBitmap(да как угодно!), а не нарисованный вручную красный кружок! как у битмапа установить черный и белый фон?
← →
Rem (2004-09-01 18:38) [12]А у меня пример (grom (01.09.04 13:54) [3]) прекрасно работает.
Просто вместо clWhite надо написать тот цвет который нужно сделать прозрачным.
Сохраненная иконка вполне хорошего качества с прозраным фоном.
Видемо пропуская Bitmap через ImageList рисунок какимто образом там конвертируеся.
== а каковы Ваши мнения ==
← →
Mihey_temporary © (2004-09-01 18:44) [13]
> можете, кокретней указать, какие два решения там есть?
Botland"овское, через TIcon и Mihey_temporary © (30.08.04 14:32) [13], через запись напрямую. В последнем случае нужно приложить усилия, чтобы 1) записать в массив TBitmap свои изображения 2) соответсвующим образом изменить данные об иконке. Второе решение сложнее, но обходит проблему максимума в 16 цветов. Если надо, то могу над этим делом поработать, довести до ума - всё равно когда-то буду.
> пыталась переделать под себя борландовский примерчик - не понимаю я, как внедрить туда уже имеющийся файл ICO? ну или проще говоря имеющийся tImage или tBitmap(да как угодно!), а не нарисованный вручную красный кружок!
Как внедрить TBitmap? Вместо:
AndMask : TBitmap;
XOrMask : TBitmap;
использовать свои растры.
Что значит фон? Вы хотите создать TBitmap белого или чёрного цвета? Создайте и используйте FillRect.
← →
Anderson © (2004-09-01 19:56) [14]Трум-пурум, Ольга, идите по этой ссылке:
http://www.sources.ru/delphi/graphics/draw_transparent_bitmap.shtml
← →
Anderson © (2004-09-01 20:00) [15]А-а-а-а-а-а...я не понимаю вас, вы не понимаете меня. Я больше не буду спрашивать у вас ничего насчет иконок, чтобы ни запутывать вас, и не запутывать себя...
Мне эти иконки месяц жизни изъели...:(
← →
Mihey_temporary © (2004-09-01 20:50) [16]
> А-а-а-а-а-а...я не понимаю вас, вы не понимаете меня. Я
> больше не буду спрашивать у вас ничего насчет иконок, чтобы
> ни запутывать вас, и не запутывать себя...
> Мне эти иконки месяц жизни изъели...:(
Нет, всё же разберись. Остановись на данном этапе и не продвигайся никуда дальше, пока не поймёшь, что к чему.
Кстати, по той ссылке, весьма LOL. Смотри, что пишут:
procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor);
Это называется масло-масляное. У TBitmap есть свойство Transparent и метод Draw, который реализован вот прям точно так же, как эта процедура.
← →
Ольга (2004-09-02 09:40) [17]И кроме того, меня НЕ интересует ОТОБРАЖЕНИЕ картинки прозрачной (это сделать проще простого, как уже сказано, с помощью свойства Transparent), мне нужно, чтоб прозрачность была ЗАШИТА в файле с картинкой, чтоб фон картинки был сам по себе ПРОЗРАЧНЫМ, а не выглядел прозрачным!
Ладно, сейчас попробую применить советы Grom, Rem (еще раз!) и Mihey_temporary
← →
Ольга (2004-09-02 11:55) [18]Народ! Счастье есть! У меня получилось!!!!! УРА!!!!!!!
Всем спасибо!
Anderson © , удачи!
procedure TForm1.Button1Click(Sender: TObject);
var
newIcon : tIcon ;
ImageList : tImageList ;
hBmp : THandle;
BkCol : TColor;
begin
// Определяем цвет фона картинки
hBmp := bmpImage.Picture.Bitmap.Canvas.Handle ;
BkCol := GetPixel(hBmp, 0, 0) ;
// Засовываем Bitmap в ImageList
ImageList := tImageList.Create(self) ;
ImageList.AddMasked (bmpImage.Picture.Bitmap, BkCol) ;
// Перекладываем Bitmap в Icon
newIcon := tIcon.Create ;
ImageList.GetIcon (0, newIcon) ;
// Сохраняем полученную иконку в файле
newIcon.SaveToFile (icoFileName) ;
newIcon.Free ;
ImageList.Free ;
end;
← →
Anderson © (2004-09-03 19:29) [19]Mihey, а ты это видел:
http://delphiworld.narod.ru/base/save_32_ico.html
Способ полегче, чем у тебя, да и понятнее (всё-таки с комментариями :-)). Посмотри его.
Эту статью я не видел ни на одном из сайтов, кроме этого.
← →
Mihey_temporary © (2004-09-03 20:46) [20]>Anderson © (03.09.04 19:29) [19]
Из текста:
>Существуют иконки более сложной структуры. Они могут содержать несколько рисунков. Я с ними не разбирался.
Кроме того, 32-битные не поддерживаются. Так что это не выход.
Слухай, ты расскажи вообще, что ты хочешь сделать то, для чего иконки мучаешь? Да, и ещё, ты разобрался с прозрачным фоном или вопрос почему-то ещё открыт?
← →
Anderson © (2004-09-04 12:23) [21]С прозрачным фоном я разобрался...в общем, через эту статью я во всем разобрался...там очень подробные комментарии, которые помогли мне.
У тебя в программе нельзя извлекать иконки из exe, dll, icl...только из ico, но и эта статья не идеальная. Допустим, в этой процедуре, прозрачным делается ВЕСЬ белый цвет, который есть в иконке, и таким образом, мы получаем не очень красивую иконку...но в 256-цветном режиме.
Я все-таки продолжу копать инфу насчет иконок на буржуйских сайтах...
← →
Mihey_temporary © (2004-09-04 16:43) [22]Если разбираешься в Visual Basic, то есть готовые решения на www.vbaccelerator.com
← →
Рыба © (2004-09-04 19:04) [23]Вам необходимо создать два битмапа, битмап маски (назовём его "AND" bitmap) и битмап изображения (назовём его XOR bitmap). Вы можете пропустить обработчики для "AND" и "XOR" битмапов в Windows API функции CreateIconIndirect() и использовать обработчик возвращённой иконки в Вашем приложении.
Пример: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);
{Уничтожаем временные битмапы}
AndMask.Free;
XOrMask.Free;
{Рисуем в качестве теста}
Form1.Canvas.Draw(IconSizeX * 6, IconSizeY, Icon);
{Объявляем иконку в качестве иконки приложения}
Application.Icon := Icon;
{генерируем перерисовку}
InvalidateRect(Application.Handle, nil, true);
{Освобождаем иконку}
Icon.Free;
end;
http://sources.ru/delphi/delphi_create_icon_from_bitmap.shtml
← →
Mihey_temporary © (2004-09-04 19:05) [24]
> Рыба © (04.09.04 19:04) [23]
Третьим будешь.
← →
Рыба © (2004-09-04 20:01) [25]Где?
← →
Рыба © (2004-09-04 20:14) [26]А, понял!
http://delphimaster.net/view/8-1093707276/
:)))))))
← →
Anderson © (2004-09-04 21:18) [27]2 Mihey
В VB я никогда не программировал, хотя, наверное, смогу при желании, потому что первым моим языком программирования, который я изучал, был Basic, но потом я понял, что Паскаль на порядок лучше. :) А на этом сайте указывается подробное описание сохранения иконки с любой глубиной цвета, чтоли? А то неохота почем зря лезть на этот сайт (ты уж меня извини):-)
Кстати, твой способ - это не твой способ, как я понял. И не способ MBo...я точно такое же способ, как у тебя, с точностью до объявления имен переменных, видел на одном из буржуйских сайтов. :)
А сейчас я пытаюсь выудить хоть какую-то информацию с англоязычных сайтов, посвященных Делфи. В сети их, кстати, довольно много и они мало чем отличаются от российских по содержанию в них информации насчет сохранения и, вообще, структуры иконок. :)
2 Рыба
Спасибо за "повторение - мать ученья".
P.S. И почему мне в голову пришла идея написания программы для извлечения и сохранения иконок...:-)
← →
Mihey_temporary © (2004-09-04 22:14) [28]Все объявления ты можешь найти здесь:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_icons.asp
Ладно, усё. Когда-нибудь доделаю чтение из EXE и DLL, но сейчас не до иконок.
Страницы: 1 вся ветка
Текущий архив: 2004.12.05;
Скачать: CL | DM;
Память: 0.61 MB
Время: 0.041 c