Здравствуйте, в этой статье опять хотелось бы поговорить о преобразовании графических форматов. На данный момент хотел бы поговорить о форматах ico и bmp. Мы уже преобразовывали bmp в jpeg и различные метафайлы, на сей раз будет работать с «иконками». Немного поговорим о самом формате ico. Данный формат предназначен для хранения значков, все значки, которые присутствуют в исполняемых файлах — все это иконки. Данный формат аналогичен формата cur, который в Windows предназначен для хранения курсоров. Размеры значков могут быть любыми, можете Вы нарисовать какой Вам по душе, но наиболее распространенные — это квадратные иконки 16х16, 32х32 и так далее. Чем больше разрешение, соответственно тем больше они размером, но иконки по своей сути не очень уже и большие в плане места на диске, которые они занимают. Вообще ico формат очень похож по своей структуре на bmp, но отличаются они между собой тем, что имеет ico дополнительное изображение, а точнее если быть, то маске. И благодаря этой маске bmp не так легко было перевести назад в ico. Если на bmp, а точнее на ее канву выводили просто иконку (изображение), а потом под нужным форматом сохраняли, то с ico так не прокатит и пришлось думать, додумывать как более проще реализовать обратное преобразование.
Итак на форме устанавливаем TButton - 2 шт и приступаем к конвертированию ico в bmp. Самый простой способ — это просто напросто перерисовать нашу иконку на канву bmp изображения, мы это уже делали и при преобразовании с другими форматами, так что тут особо пояснять ничего не буду. На событие OnClick нашей кнопки пишем следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
Ico:TIcon;
bmp:TBitmap;
begin
try
Ico:=TIcon.Create;
bmp:=TBitmap.Create;
Ico.LoadFromFile('100137.ico');
bmp.Width:=ico.Width;
bmp.Height:=Ico.Height;
bmp.Canvas.Draw(0,0,Ico);
bmp.SaveToFile('1.bmp');
FreeAndNil(bmp);
FreeAndNil(Ico);
except
on e:Exception do
//-//-//-//-//-//
end;
end;
А те кто играют в игры от Alawar, придется скачать генератор ключей для игр Alawar, совершенно бесплатно |
Просто незабываем освобождать память от , созданных Вами переменных для работы с изображениями. Теперь приступим к преобразованию в обратном порядке. BMP в ICO преобразовать чуточку сложнее, как Вы помните я говорил, чем они между собой отличаются — маской, и у TIcon нету такого метода Draw, чтобы напрямую можно было перерисовать наше изображение, многие создают структуру файла ico и делают преобразование, но мы обойдемся TImageList, там зададим нужную нам маску и в путь, изображение преобразовано. Давайте на событие OnClick напишем следующий код
procedure TForm1.Button2Click(Sender: TObject);
var
Bmp: TBitmap;
Icon: TIcon;
ImageList: TImageList;
begin
Bmp := TBitmap.Create;
Icon := TIcon.Create;
try
Bmp.LoadFromFile('1.bmp');
ImageList := TImageList.CreateSize(Bmp.Width, Bmp.Height);
try
ImageList.AddMasked(Bmp, Bmp.TransparentColor);
ImageList.GetIcon(0, Icon);
Icon.SaveToFile('1.ico');
finally
ImageList.Free;
end;
finally
Bmp.Free;
Icon.Free;
end;
end;
Мы создаем TImageList с нужным нам изображением и размерам, а потом ему задаем маску, по умолчанию это изображение записывается в TImageList под номером 0, затем просто с помощью GetIcon мы получаем это изображение и пересохраняем в нужном нам формате, как видите ничего сложного и все очень и очень просто. Также можно с помощью TImageList поступить и с преобразованием ico-bmp. Только в данном случае мы не будем задавать никакой маски, а напрямую из TImageList получим изображение и пересохраним его под нужным форматом. На событие OnClick напишем следующий код
procedure TForm1.Button3Click(Sender: TObject);
var
Bmp: TBitmap;
Icon: TIcon;
ImageList: TImageList;
begin
Bmp := TBitmap.Create;
Icon := TIcon.Create;
try
icon.LoadFromFile('1.ico');
ImageList := TImageList.CreateSize(Icon.Width, Icon.Height);
try
ImageList.AddIcon(icon);
ImageList.GetBitmap(0,bmp);
bmp.SaveToFile('2.bmp');
finally
ImageList.Free;
end;
finally
Bmp.Free;
Icon.Free;
end;
end;
Ну что вот еще с одним преобразованием графических форматов мы разобрались, полный исходник статьи можно скачать тут
Автор статьи - Andrey53
Метки: TImageList, преобразовать bmp в ico, преобразовать bmp в ico на Delphi, преобразовать ico в bmp, преобразовать ico в bmp на Delphi
лучше бы вы посмотрели как в имаджлисте оно преобразуется, и делали бы без его использования.
т.е изучить метод TImageList.getIcon
у всех компонентов есть свое назначение. и назначение TImageList — хранение списка иконок определенного размера, а не конвертация изображения формата одного в другой
смотреть в методе ImageList.GetBitmap особо и нечего, как я понял там вызывается какая-то апи ImageList_GetIcon из comctl32.dll , а в качестве одного из параметров передается дискриптор имиджлиста, так что его создавать по любому надо
to ter, да согласен через TImageList конвертирует обрезанно, но можно это исправить, зато это самый простой способ, чтобы конвертировать BMP в ICO без TImageList, придется написать достаточно кода, а еще и немного в графике разобраться