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

Вниз

Создание 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 вся ветка

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

Наверх





Память: 0.62 MB
Время: 0.036 c
3-1099832621
DeepProg
2004-11-07 16:03
2004.12.05
Отобразить Memo поле в DBGrid - вариация на тему


1-1101107709
uny
2004-11-22 10:15
2004.12.05
Алгоритм - как выделить число


14-1100757653
sniknik
2004-11-18 09:00
2004.12.05
Разминка к пятнице, легкая задачка на четверг...


9-1088730453
Xerx
2004-07-02 05:07
2004.12.05
Источники света


11-1083860707
Delphi5.01
2004-05-06 20:25
2004.12.05
Как преобразовать Self в pCotrol :-)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский