В этот раз хотел поговорить о том, как можно конвертировать изображения из одного формата в другой. На данный момент я остановился на JPEG в Bitmap и наоборот. Тут ничего по сути сложного нету, просто мне например данная задача пригодилась для пакетного конвертирования форматов изображения. Так что вполне данная задача кому-то еще понадобится, для сравнения этих двух форматов можно почитать на википедии, можно сказать одно, что jpeg применяется для сжатия изображения, но здесь присутствует недостаток в том, что если использовать очень высокую степень сжатия для jpeg-файлов, то изображение просто напросто может разбиться (посыпаться) на блоки с пикселями. В bmp-изображениях для отображения предоставляемых цветов отводится от 1 до 48 битов. Наверное самое часто используемое — это 24 бита, при 48 битах — данный формат используется редко с повышенной точностью передачи цвета и соответственно он будет размером намного больше чем тот же с 24 битами передачи цвета, так вот данным переводом (конвертацией) мы добьемся снижения размера изображения и разные алгоритмы передачи цвета.
Давайте тогда установим все необходимые компоненты. У меня
- TGroupBox — 2 шт
- TEdit — 2 шт
- TLabel — 2 шт
- TButton — 6 шт
- TOpendialog
- TSaveDialog
В одном блоке у нас будет конвертация jpeg в bmp, а в другом блоке наооборот. Также нам необходимо в uses подключить модуль jpeg, чтобы мы могли работать с jpeg-изображениями в Delphi. После этого разберемся как конвертировать BMP в JPEG. Сейчас напишем код для открытия bmp-файла.
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName
else
exit;
end;
А теперь код, который будет задавать имя, сохраняемого (выходного) jpeg-файла.
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
Edit2.Text:=SaveDialog1.FileName+'.jpg';
end
else
exit;
end;
Ну а теперь непосредственно приступим к самой конвертации наших изображений, на OnClick кнопки напишем код
procedure TForm1.Button3Click(Sender: TObject);
var
jpg:TJPEGImage;
bmp:TBitmap;
begin
try
jpg:=TJPEGImage.Create;
bmp:=TBitmap.Create;
bmp.LoadFromFile(Edit1.Text);
jpg.Assign(bmp);
jpg.SaveToFile(Edit2.Text);
jpg.Free;
FreeAndNil(bmp);
except
on e:Exception do
begin
jpg.Free;
bmp.Free;
end;
end;
end;
Не забываем в uses подключить jpeg. Мы создали экземпляры класса TGraphic — jpeg и bmp. Затем в bmp мы загружаем изображение, которое нам необходимо конвертировать, а после чего с помощью Assign сохраняем его в jpeg, после чего по ранее созданному имени файла, сохраняем наш jpeg-файл на диск. Теперь можно протестировать очень легко, если нету bmp-изображений, то очень легко его создать — открыть mspaint и нарисовать пару линий и сохранить как bmp-изображение, после этого открываем его и нажимаем на кнопку «Конвертировать«, сравниваем их размеры — отличаются значительно.
Теперь приступи к обратному действию — Конвертация JPEG в BMP. Код для открытия jpeg-файла тот же самый
procedure TForm1.Button4Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit3.Text:=OpenDialog1.FileName
else
exit;
end;
Для сохранения почти тот же самый
procedure TForm1.Button5Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Edit4.Text:=SaveDialog1.FileName
else
exit;
end;
Ну а теперь сам код, который конвертирует наши изображения
procedure TForm1.Button6Click(Sender: TObject);
var
jpg:TJPEGImage;
bmp:TBitmap;
begin
try
jpg:=TJPEGImage.Create;
bmp:=TBitmap.Create;
jpg.CompressionQuality:=100;
jpg.Compress;
jpg.LoadFromFile(Edit3.Text);
bmp.Assign(jpg);
bmp.SaveToFile(ChangeFileExt(Edit4.Text,'.bmp'));
FreeAndNil(jpg);
FreeAndNil(bmp);
except
on e:Exception do
begin
FreeAndNil(jpg);
FreeAndNil(bmp);
end;
end;
end;
Тут почти тоже самое, только мы с помощью CompressionQuality устанавливаем качество изображения (передачи цветов) — за счет этого у нас и увеличивается размер изображения.
Исходник статьи можно скачать тут