Kompresja pliku *.jpg

0

Witam,

Czy ktoś ma pomysł jak w locie zwiększyć kompresję pliku graficznego </b>jpg</b>. Chodzi mi o to, że mam już obraz zapisany w </b>jpg</b> i chcę zmniejszyć jego objętość przy użyciu CompressionQuality.
Próbowałem różnych swoich wariacji i jedyne co osiągnąłem to zapis nowego pliku w tej samej objętości m. in. JGP>JPG jak również JPG>BMP>JPG.

Z góry dzięki.

0

dalsza kompresja pliku jpg nie ma sensu - wynika to z budowy formatu pliku.
kompresja pliku jpg opiera sie na DCT (Distcreet Cosinus Transform - czyli dyskretna transformate cosinusowa). polega ona na podzielenie obrazu na skonczony i zamkniety zbior blokow o wymiarach 8x8 pikseli oraz poddanie ich kwantyzacji tworzac tablice wspolczynnikow DCT.
Kompresja stratna zastosowana w jpg lezy w dziedzinie czestotliwosciowej, wiec usuwane dane sa czestotliwosciowo najmniej uzywane i zalozenie jest takie, ze zarazem najmniej potrzebne w obrazie. Daje to wysoki wynik kompresji, pozbawionej wiekszosci bledow (takicha jakie posiadaja np. kompresje oparte o histogramy), a wynik mozna powiedziec jest najmniejszym zbiorem wartosci zdolnych do opisania obrazu bez widocznej utraty jakosci.
Dlataego powtorze dalej - stosowanie dalszej kompresji jest bez sensu - bo albo sie nie uda, albo skutecznie zniszczy plik

0

To co napisałeś jest dla mnie niestety niezrozumiałe.

Skoro według Ciebie dalsza kompresja jest niemożliwa lub będzie obarczona zbyt dużymi stratami to jak mi wytłumaczysz, że takowy plik poddany dodatkowej kompresji w programie ACDSee nie ma strat w jakości o jakich mówiłeś? Dodatkowo jak widać jest to możliwe.
W programie tym jak dam "Zapisz jako" i wejdę w "Opcje" suwak pokazuje mi aktualną kompresję powiedzmy 65, gdy nim zjadę na 10 i dam zapisz plik zmniejsza mi się o połowę, a straty są prawie niezauważalne.

Dla mnie jest to o tyle ważne, że pliki o których mówię mają być dostępne poprzez połączenia modemowe. Ich aktualna objętośc waha się w przedziale 260-300 KB. Poddane dodatkowej kompresji ich objętośc zmniejsza się do 130-150 KB. Tylko, że teraz trzeba to robić ręcznie. Obrazy te są ściągane z wewnętrznego intranetu moim programem, a jest ich sporo bo co 0.5 godziny.

0

pozwolę sobie trochę się powymądrzać nie do końca na temat.
anubis - pamiętasz, że po dct jest jeszcze kwantyzacja? w zależności od przyjętego progu i rozdzielczości kwantyzatora dostajesz różną kompresję obrazu. sama dct niczego nie kompresuje.

wynik mozna powiedziec jest najmniejszym zbiorem wartosci zdolnych do opisania obrazu bez widocznej utraty jakosci.

też bym polemizował, bo co to jest widoczna utrata jakości? poza tym transformata falkowa (jpeg2000) opisuje obraz jeszcze lepiej, a zarazem oszczędniej. dlatego nie mogę się z Tobą zgodzić.

zresztą sam przyznasz, że jpg ma różne stopnie kompresji i każda produkuje obraz o innym rozmiarze (i jakości).

0

ale ja sie z toba zgodze - metoda falkowa oczywisce ze jest znacznie wydajniejsza od dct. Jednakze potraktowalem pytanie o standardowy format jpg, nie o wersje 2000.
Natomioast odnosnie kwantyzacji to wspomnialem o niej w swojej wypowiedzi, calosc moze nie jest zbyt zrozumiale i pozornie nie trzymajace sie kupy, gdyza aby calosc opisac to napisalbym spory artykul...

ale, dzieki za uwagi

0

To może tak łopatologicznie, po tych naukowych wywodach...

jpg.LoadFromFile;
jpg.CompressionQuality := jakosc;
jpg.SaveToFile;

tyle.

0

Dzięki za uwagi moim teoretykom odnośnie kwantyzacji i transformaty falkowej itp., bez obrazy. Nie interesuje mnie jak to JPEG robi, ale efekt końcowy. Dodatkowa kompresja wykonana w ACDSee o której wspominałem nie pogarsza znacząco jakości obrazu ani nie zmienia jego rozdzielczości. Ja przynajmniej to przetestowałem i wiem, że tak jest.

Dzięki "AndRew" za propozycję, ale od niej zaczynałem. Efektem końcowym Twojej propozycji jest plik o tej samej objętości.

Może jakiś PRAKTYK się zlituje i zaproponuje rozwiązanie, które mnie usatysfakcjonuje.

// ;-) - ŁF

0

var o:Tjpegimage;

o:=Tjpegimage.Create;
o.LoadFromFile;
o.CompressionQuality:=;
o.DIBNeeded;
o.Compress;
o.SaveToFile;
o.free;

i wcale nie ejstem praktykiem. Zaciekawilo mnie w czym moze byc problem. Calosc kosztowala mnie F1 i 5 minut klikania i czytania helpa.
Czyzbym byl geniuszem? A może raczej ktos tu jest leniem :P

0

Dzięki Marmar !!!

Oto mi chodziło.
Czy jestem leniem? Cóż nie mi to sądzić. Teraz jest to jasne, ale też grzebałem w helpie. Tylko, że mi nie przyszło do głowy zastosować funkcję:

jpg.DIBNeeded

a o nią się sprawa się rozbijała.
Ćwiczyłem z Assign, JPGNedeed i mi nie wychodziło. Po prostu podszedłeś może inaczej i Ci wyszło jak piszesz w 5 minut, gratuluję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1