Здравствуйте, в этой статье опять хотелось бы поговорить о преобразовании графических форматов. На данный момент хотел бы поговорить о форматах 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;
Ну что вот еще с одним преобразованием графических форматов мы разобрались, полный исходник статьи можно скачать тут