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.
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.
Można.
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 :)
końcowy wyraz "pixeloza" raczej nie nadaje się do poważnego artykułu :)
Bardzo mi pomogles. Dzieki...