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