Преобразовать MetaFile в Bitmap и наоборот

4 минуты на чтение

В прошлой статье по преобразованию графических форматов — мы рассмотрели как можно преобразовать JPEG в Bitmap и наоборот. В этой статье также хотел рассмотреть преобразование графических форматов, но уже других, также довольно популярных, которые также можно сделать пакетным преобразование данных форматов. В данном случае — это преобразование *.WMF в *.BMP файлы. WMF - это формат векторных графических файлов, данный формат разработан Microsoft, так что его использование в других каких-либо операционных системах — бесполезно, в других ОС есть похожие форматы векторных изображений. Тут в wmf, emf-файлах конечно размер файла самого побольше, чем в bmp-файлах, хотя можно ужать очень хорошо, качество конечно при конвертации очень меняется, что в ту сторону, что в обратную.

Теперь давайте определимся, что у нас будет находится на форме

  • TGroupBox — 2 шт
  • TButton — 4 шт
  • TLabel — 4 шт
  • TOpenDialog
  • TSaveDialog

Ну и в принципе все. В общем расположите примерно компоненты, как показано на рисунке.

Дальше мы напишем код для открытия файла и для сохранения соответсвенно

Для открытия

procedure TForm1.Button1Click(Sender: TObject);
begin
   if OpenDialog1.Execute then
    Edit1.Text:=OpenDialog1.FileName
   else
    exit;
end;

Для сохранения

procedure TForm1.Button2Click(Sender: TObject);
begin
   if SaveDialog1.Execute then
    Edit2.Text:=SaveDialog1.FileName
   else
    exit;
end;

Итак теперь непосредственно к самому конвертированию приступим, для этого на событие OnClick кнопки напишем следующий код

procedure TForm1.Button3Click(Sender: TObject);
var
 MetaFile:TMetafile;
 MetaCanvas:TMetafileCanvas;
 bmp:TBitmap;
begin
   try
    MetaFile:=TMetafile.Create;
    bmp:=TBitmap.Create;
    bmp.LoadFromFile(Edit1.Text);
    MetaFile.Height:=bmp.Height;
    MetaFile.Width:=bmp.Width;
    MetaCanvas:=TMetafileCanvas.Create(MetaFile,0);
    MetaCanvas.Draw(0,0,bmp);
    MetaCanvas.Free;
    MetaFile.SaveToFile(ChangeFileExt(Edit2.Text,'.wmf'));
    MetaFile.Free;
    bmp.Free;
   except
    on e:Exception do
     begin
      MetaFile.Free;
      MetaCanvas.Free;
      bmp.Free;
      ShowMessage(e.Message);
     end;
   end;
end;

Что мы тут делаем, используем TMetaFile, далее в Bitmap загружаем изображение, формируем наш метафайл, задав ему ширину, высоту и затем с помощью TMetafileCanvas мы перерисовываем наш Bitmap в TMetaFile, задав первоначальные координаты. После перерисовки мы сохраняем файл. Если откроем файл, то можно увидеть, что качество картинки немного ухудшилось. Теперь непосредственно перейдем к обратной конвертации

procedure TForm1.Button4Click(Sender: TObject);
begin
   if OpenDialog1.Execute then
    Edit3.Text:=OpenDialog1.FileName
   else
    exit;
end;
 
procedure TForm1.Button6Click(Sender: TObject);
var
 bmp:TBitmap;
 MetaFile:TMetafile;
begin
   try
    MetaFile:=TMetafile.Create;
    bmp:=TBitmap.Create;
    MetaFile.LoadFromFile(Edit3.Text);
    bmp.Height:=MetaFile.Height;
    bmp.Width:=MetaFile.Width;
    bmp.Canvas.Draw(0,0,MetaFile);
    bmp.SaveToFile(ChangeFileExt(Edit4.Text,'.bmp'));
    bmp.Free;
    MetaFile.Free;
   except
    on e:Exception do
     begin
      bmp.Free;
      MetaFile.Free;
      ShowMessage(e.Message);
     end;
   end;
end;

Открытие и сохранения файлов почти теже самые, только используются другие TEdit. Тут почти тоже самое, также загружаем в TMetaFile - метафайл, затем формируем Bitmap-файл, задав ему ширину, высоту и перерисовываем на наш Bitmap, задав координаты перерисовки, только одно отличие тут, что мы не используем дополнительный класс канвы, а уже стандартный. Если открыть наш Bitmap, то опять же можно увидеть как качество картинки поменялось, проделывая эту операцию с одним и тем же файлом, то можно качество картинки совсем потерять.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

В этот раз хотел поговорить о том, как можно конвертировать изображения из одного формата в другой. На данный момент я остановился на JPEG в Bitmap и наоборот. Тут ничего по сути сложного нету, просто мне например данная задача пригодилась для пакетного конвертирования форматов...
Здравствуйте, в этой статье опять хотелось бы поговорить о преобразовании графических форматов. На данный момент хотел бы поговорить о форматах ico и bmp. Мы уже преобразовывали bmp в jpeg и различные метафайлы, на сей раз будет работать с «иконками». Немного поговорим о самом фо...