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

Метки: , , , ,




К записи “Преобразовать ICO в BMP и наоборот” оставлено комментариев: 3.

  1. ter:

    лучше бы вы посмотрели как в имаджлисте оно преобразуется, и делали бы без его использования.
    т.е изучить метод TImageList.getIcon

    у всех компонентов есть свое назначение. и назначение TImageList — хранение списка иконок определенного размера, а не конвертация изображения формата одного в другой

  2. chrum:

    смотреть в методе ImageList.GetBitmap особо и нечего, как я понял там вызывается какая-то апи ImageList_GetIcon из comctl32.dll , а в качестве одного из параметров передается дискриптор имиджлиста, так что его создавать по любому надо

  3. Andrey53:

    to ter, да согласен через TImageList конвертирует обрезанно, но можно это исправить, зато это самый простой способ, чтобы конвертировать BMP в ICO без TImageList, придется написать достаточно кода, а еще и немного в графике разобраться

Оставить комментарий

Вы можете использовать следующие теги:

*