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

Бытовая техника — неотъемлемая часть нашей жизни, без нее мы сейчас никуда, она нам во всем покупает. Хочу также сказать, что существует интернет магазин бытовой техники, который позволяет приобрести любимую технику, а также очень облегчает процесс покупки, оплаты и доставки.

Исходник статьи можно скачать тут

Автор статьи - Andrey53

Метки: ,




К записи “Преобразовать JPEG в Bitmap и наоборот” оставлено комментариев: 6.

  1. awex:

    А не проще ли писать так?

    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'));
    finally
    FreeAndNil(jpg);
    FreeAndNil(bmp);
    end;

  2. Andrey53:

    2awex можно и так, я не против, но мне так удобнее

  3. Макс:

    Исходник не работает!

  4. Макс:

    При конвертации больших размеров выдает ошибку((

  5. Дима:

    А пойдёт этот код в Lazarus?

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

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*