Obsługa formatu JPEG

Adam Boduch

Kompresja plików graficznych do formatu JPEG jest ciekawym tematem. Format ten pozwala na spore zmniejszenie rozmiaru pliku graficznego kosztem niewielkiej utraty jakości obrazu. W Delphi obsługa formatu JPEG występuje od wersji 3.

Żeby móc operować na plikach .jpg należy zadeklarować moduł JPEG dodając słowo jpeg do listy modułów uses.

uses
  jpeg;

Wcześniej zastanawiałeś się pewnie dlaczego do TImage'a nie można wczytać obrazka .jpg. Po uzupełnieniu listy uses o wpis jpeg staje się to możliwe. W praktyce wygląda to tak:

  JPG := TJPEGImage.Create;
  JPG.LoadFromFile('C:\\mntb.jpg');
  Image1.Picture.Assign(JPG);

Na samym początku następuje deklaracja zmiennej nowego typu, później wczytanie obrazka, a na końcu wyświetlenie go w TImage'u (funkcja Assign). Można to także zrobić bez użycia komponentu. Oto przykład:

  JPG := TJPEGImage.Create;
  JPG.LoadFromFile('C:\\mntb.jpg');
  Canvas.Draw(10, 10, JPG);

Jak widzisz ostatni przykład od poprzedniego różni się tylko jedną linią. Użyta została tutaj procedura Canvas.Draw, która rysuje na płótnie (w naszym przypadku na płótnie formatki) grafikę przekazaną w ostatnim argumencie. Pierwsze dwa argumenty to współrzędne punktu, z którego procedura rozpocznie rysowanie obrazka.

Wyświetlanie obrazków .jpg mamy już za sobą, teraz należy powiedzieć parę słów o konwersji do tego formatu. Spróbujmy skonwertować obrazek .bmp do .jpg. Umieść na formularzu TButton i kliknij na niego dwukrotnie. Uzupełnij kod procedury w ten sposób:

procedure TForm1.Button1Click(Sender: TObject);
var
  JPG : TJPEGImage; // deklaracja nowej zmiennej
  Bmp : TBitmap;
begin
  JPG := TJPEGImage.Create;
  BMP := TBitmap.Create;

  BMP.LoadFromFile('C:\\mntb.bmp');
  JPG.Assign(BMP); // pobranie z BMP
  JPG.SaveToFile('C:\\mntb.jpg'); // zapisanie
end;

Prawda, że nie jest to trudne? Na samym początku następuje deklaracja dwóch zmiennych - JPG i BMP. Następnie zmienne te są tworzone. Później do zmiennej BMP zostaje przypisany obrazek w formacie .bmp. A potem zmienna JPG pobiera obrazek ze zmiennej BMP (funkcja Assign). Na końcu zmienną JPG zawierającą obrazek w nowym formacie zapisujemy pod nową nazwą, ze zmienionym rozszerzeniem.

Przed zapisaniem pliku warto dokonać kompresji obrazka .jpg:

  JPG.Compress; // kompresja
  JPG.SaveToFile('C:\\mntb.pcx');

Wypadałoby jeszcze omówić sposoby kompresji. Odpowiada za to właściwość Performance, która daje Ci możliwość wyboru sposobu kompresji: najlepszy (jpBestQuality), albo najszybszy (jpBestSpeed). Oto przykład zastosowania:

JPG.Performance := jbBestQuality;

Istnieje jeszcze możliwość ustawienia jakości kompresji. Odpowiada za to właściwość CompressionQuality. Oto przykład jej użycia:

JPG.CompressionQuality := 100; 

Przypisanie jej wartości 100 daje najsłabszą kompresję (przykładowo z 1,37 MB do 124 kB) w zamian za bardzo dobrą jakość obrazka. Teraz spróbuj ustawić tę właściwość na 1:

  JPG.CompressionQuality := 1;

Wynikiem takiej kompresji będzie bardzo niewiele zajmujący plik (np. 9 kB), jednak jakość obrazu spadnie tak znacząco, że obrazek może stać się zupełnie nieczytelny.

8 komentarzy

Cytat:

MikiKam dnia 04-07-2007 22:50
Od Delphi7 jeżeli używamy w TImage obrazka JPEG to do sekcji uses moduł jpeg dodale się samoczynnie.

Ta czynność (kompilatora) wyatępuje już nawet w Delphi 3. Więc nie cudacz(cie).

Od Delphi7 jeżeli używamy w TImage obrazka JPEG to do sekcji uses moduł jpeg dodale się samoczynnie.

THX god za ten artykul!! A czy można konwertować pliki innych formatów??

Ale nawet mało skompresowane JPEGi mają niezauważalnie niższą jakość, lecz o wiele mniejszy rozmiar.

Heh, tych zdań akurat nie zmieniałem poprawiając wersję Adama Boducha, ale już zastąpiłem je innymi :)

Po co zapisywać plik w formacie .bmp skoro można użyć .jpg, który jest o wiele bardziej wydajniejszy...
Choćby dlatego, aby nie stracić jakości... brakuje tego tu przy tym zdaniu

końcowy wyraz "pixeloza" raczej nie nadaje się do poważnego artykułu :)

Bardzo mi pomogles. Dzieki...