Planuję napisać skrypt, który zeskanuje ponad 100 000 obrazów JPEG i ponownie skompresuje je, jeśli są „zbyt duże” pod względem rozmiaru pliku. Skrypty to łatwa część, ale nie jestem pewien, jak zaklasyfikować obraz jako „zbyt duży”.
Na przykład jest obraz o wielkości 2400 x 600 pikseli z rozmiarem pliku 1,81 MB. Polecenie „Zapisz dla” programu Photoshop dla sieci tworzy plik 540 KB o jakości 60 i tych samych wymiarach. To około 29% oryginalnego rozmiaru.
Teraz myślę o użyciu tych liczb jako wytycznych. Coś w rodzaju 540 KB / (2400 * 600/1 000 000) = 375 KB na megapiksel. Każdy obraz większy niż ten jest uważany za duży. Czy to jest właściwe podejście, czy jest lepsze?
Edycja 1: obrazy muszą być zoptymalizowane do wyświetlania na stronach internetowych.
Edycja 2: Potrafię określić pożądaną jakość wyjściową przez eksperymentowanie, muszę wiedzieć, czy obrazy są duże pod względem rozmiaru pliku wrt wymiarów i należy je zapisać w niższej jakości.
źródło
Odpowiedzi:
Na średni , sweet spot Jpeg jest wokół jednego bitu na każdy piksel .
To oczywiście będzie się różnić w zależności od zawartości obrazu, ponieważ niektóre rodzaje grafiki (np. Płaskie obszary i gładkie gradienty) kompresują się lepiej niż inne (szumy, tekst), więc nie jest to niezawodna metoda ślepego stosowania do każdego obrazu.
Masz również problem z brakiem nieskompresowanego obrazu referencyjnego do porównania, więc tak naprawdę nie wiesz na pewno, jaka jest obecna jakość posiadanych obrazów i o ile bardziej możesz obniżyć jakość, aby być nadal akceptowalnym. Jakość można do pewnego stopnia odgadnąć na podstawie tabel kwantyzacji w plikach JPEG, ale nie jest to również niezawodna metoda (w szczególności ocena jakości ImageMagick jest bardzo nieprawidłowa w przypadku plików JPEG z niestandardowymi, zoptymalizowanymi tabelami kwantyzacji).
To powiedziawszy, istnieje rozsądne praktyczne podejście:
Ważne jest, aby nie wybierać tylko mniejszego rozmiaru pliku i zamiast tego wymagać znacznego zmniejszenia rozmiaru pliku. Wynika to z faktu, że rekompresja JPEG zawsze powoduje nieznaczne zmniejszenie rozmiaru pliku z powodu utraty szczegółów spowodowanej stratną naturą JPEG i konwersją do 8-bitowego RGB, więc małe spadki rozmiaru pliku mogą mieć nieproporcjonalnie duży spadek jakości, który nie jest wart to.
źródło
Rozmiar plików skompresowanych za pomocą JPEG różni się w zależności od złożoności obrazu. Próba kontrolowania rozmiarów plików w sposób opisany zaowocuje bardzo zmienną postrzeganą jakością obrazu.
Zamiast tego rozważ następujące opcje:
Dość dobre podejście. Użyj ustawienia jakości, które uważasz za akceptowalne, na przykład 75. Porównaj rozmiar wyniku z oryginalnym obrazem i zachowaj mniejszy plik. Zobacz Jaką jakość wybrać przy konwersji na JPG?
Użyj minimalizatora JPEG , takiego jak JPEGmini lub
jpeg-recompress
z archiwum JPEG . Są one zasadniczo zaprojektowane do robienia tego, co chcesz, ale z większą świadomością wewnętrznych algorytmów JPEG.Generuj miniatury o różnych rozmiarach , jak sugeruje Nathancahill , z perspektywy programisty.
źródło
Nie. To złe podejście.
Rozmiar pliku w pikselach, tak, ma coś wspólnego z ostateczną wagą, ale nie jest to jedyny czynnik.
Zrób test. Weź całkowicie biały plik o tym samym rozmiarze 2400 x 600 pikseli i zapisz go jako JPG.
Teraz zrób zdjęcie lasu (tego samego 2400 x 600 pikseli) z dużą ilością szczegółów i zapisz go. Ten plik będzie większy przy użyciu tych samych ustawień kompresji.
Ostateczny rozmiar zależy od tych 3 czynników:
Dlatego nie możesz i nie powinieneś definiować wagi w oparciu o rozmiar w pikselach.
Ale rozumiem twój problem.
Bez analizy bieżącej kompresji obrazu trudno jest określić „optymalną” wagę (która zależy od obserwatora lub użycia obrazów)
Prawdopodobnie możesz zdefiniować ustawienie kompresji i ponownie skompresować „wszystkie”. Nie wiem, czy chcesz to zrobić przed „przesłaniem”, co prawdopodobnie zaoszczędzi ci więcej czasu niż zaoszczędzone pomijanie niektórych z nich.
Istnieje kilka narzędzi, które analizują obraz i obliczają bieżący współczynnik kompresji. Ale wątpię, żeby to było tak ważne.
źródło
jpeg size / raw size
iraw size = pixel size * number of pixel
,pixel size
będąc 3 oktety w przestrzeni barw RGB 24bit. I jak sam mówisz, ta metryka nie wystarczy, aby ustalić, czy obraz jest wystarczająco skompresowany.Deweloper stron internetowych tutaj. Oto jak do tego podejdę:
1. Określ wyświetlane wymiary obrazu i wymagane rozdzielczości ekranu.
Twoim pierwszym zadaniem jest określenie, w jakich rozmiarach będą wyświetlane obrazy. Czy to zdjęcia produktów w sklepie internetowym? Galeria zdjęć? Zdjęcia profilowe użytkownika? Wiele różnych rozmiarów? Zrób listę potrzebnych wymiarów pikseli. Sprawdź, czy potrzebujesz obrazów @ 2x dla ekranów o wysokiej rozdzielczości, takich jak najnowsze telefony i tablety.
2. Użyj skryptu miniatur, aby utworzyć nowe pliki obrazów.
Są to tak zwane skrypty miniatur, ale można ich używać o wiele więcej niż tylko miniatur. Istnieje wiele skryptów lub możesz napisać własny. Nie zmieniając rozmiaru oryginalnych plików, możesz to zrobić, jeśli popełnisz błąd w skrypcie lub zorientujesz się, że potrzebujesz obrazu o wyższej rozdzielczości. Powszechną praktyką jest określenie sufiksu w wyjściowej nazwie pliku. Na przykład:
3. Kompresuj.
Skrypt miniatur powinien określać kompresję jpg podczas cięcia nowych plików obrazów. Istnieją jednak inne minimalizatory, które mogą jeszcze bardziej zmniejszyć rozmiar pliku.
źródło
Podczas gdy odpowiedź @ Rafael wyjaśniła w jaki sposób kompresja JPEG jest dostępna, spróbuję odpowiedzieć na twoją stronę i załadować problematycznie.
Użycie obrazu na stronie internetowej (do projektowania lub treści) narzuca pewne imperatywy: do czego będzie używany mój obraz? Logo, zdjęcie na okładkę, miniatura, zdjęcie w poście na blogu, zdjęcie pełnoekranowe do galerii ... Ponadto, jeśli używasz go do wielu celów (np. Zdjęcie i jego miniatura galerii), chcesz odrzucić je we wszystkich wymaganych rozmiarach. Jednak, chyba że budujesz własną stronę internetową, większość obecnych serwisów internetowych będzie generować obrazy o mniejszych rozmiarach z większego obrazu w celu użycia na stronie.
Teraz, gdy znasz już swój cel związany z obrazem, witryna (lub CMS lub front-end Framework) zawsze będzie wymagała maksymalnego rozmiaru w pikselach, aby obraz był zgodny. Logo może mieć maksymalnie 600 x 600 pikseli, okładka tła może mieć maksymalnie 1280 x 720 pikseli, treść zdjęcia do wyświetlania na pełnym ekranie 1920 x 1080 lub natywna rozdzielczość aparatu w celu zachowania absolutnej szczegółowości. Sprawdź prawidłowy rozmiar w witrynie, do której chcesz przesłać. Chcesz dopasować co najmniej jeden z wymaganych maksymalnych rozmiarów pikseli, w zależności od proporcji, którą chcesz osiągnąć. Uwaga, niektóre usługi przycinają i rozciągają obraz, jeśli proporcje nie są takie same. W takim przypadku konieczne będzie ponowne przekopiowanie obrazu w celu dopasowania do wymaganego maksymalnego rozmiaru i proporcji.
Następnie strona internetowa może nałożyć limit rozmiaru pliku (lub nie, w zależności od celu obrazu). Jeśli chodzi o czas ładowania strony, im jaśniejszy, tym lepiej. W twoim przykładzie obrazu w wysokiej rozdzielczości o wymiarach 2400 x 600 pikseli, od 300 do 500 kB jest całkowicie dobrym czasem ładowania. Obrazy zawartości (takie jak zdjęcia) mogą być cięższe, jeśli wymaga tego cel zdjęcia (np. Wyświetlanie pełnoekranowe), w razie potrzeby do natywnej rozdzielczości aparatu. Jeśli nie podano żadnego wskazania, limit rozmiaru pliku może być trudny do odgadnięcia, ponieważ może zależeć od wyposażenia odbiorców (urządzenia mobilne, komputery stacjonarne ...), jakości sieci odbiorców w kraju ... Aby uzyskać maksymalną jakość i obsługę, należy traktować zdjęcia pojedynczo uzyskaj minimalny rozmiar pliku bez widocznych artefaktów. Dla wygody lub szybkości przetwarzania, zmiana rozmiaru skryptu przy użyciu ogólnie satysfakcjonującego poziomu kompresji (około 70 powinno być w porządku).Odpowiedź @ Xiota może być również potrzebnym narzędziem. Ustaw tutaj swój własny standard.
TL; DR cel obrazu na stronie internetowej jest kluczem do zmiany rozmiaru / kompresji.
źródło
To, co obliczasz, to średni skompresowany rozmiar piksela obrazu, jeśli podzielisz go przez rozmiar surowego piksela (zwykle 3 oktety dla 24-bitowego RGB), otrzymasz współczynnik kompresji.
Jest to dobra miara, która podaje informacje o stanie kompresji obrazu, ale nie wystarczy ocenić, czy obraz jest wystarczająco skompresowany, czy nie, ponieważ współczynnik kompresji nie zależy tylko od profilu kompresji (algorytm = JPEG, jakość = 60/100), ale także potencjał kompresji obrazu: różne obrazy o tym samym surowym rozmiarze i tym samym profilu kompresji dają różne rozmiary JPEG, ponieważ obrazy są mniej lub bardziej łatwe do skompresowania (pusty obraz jest bardzo łatwy do skompresowania, biały hałas nie jest).
Z tego powodu i ponieważ profil jakości „ostatnio używany” nie jest przechowywany na tym obrazie (ani w metadanych, ani w strukturze nagłówka jpeg), najczęściej stosowanym podejściem przy ponownej publikacji obrazów o docelowym profilu wielkości / jakości jest po prostu ponowna kompresja (i potencjalnie zmienia rozmiar) wszystkiego (automatycznie) niezależnie od początkowego stanu obrazu.
Tak, możesz ponownie skompresować, gdy nie jest to konieczne, tak, możesz nawet stracić miejsce, jeśli kompresujesz z profilem wyższej jakości, ale są to przypadki skrajne i na dużą skalę najłatwiej jest to zrobić, aby zapewnić docelowy profil jakości. Oczywiście, chcesz to zrobić tylko raz, aby stopniowo nie degradować obrazów, i prawdopodobnie powinieneś przechowywać dwie biblioteki obrazów: początkową „nietkniętą” i „do opublikowania / skompresowania”.
Istnieje wiele narzędzi do ponownej kompresji wielu plików, możesz także pisać własne skrypty i używając odpowiedniego stosu technicznego (głównie C ++ i libjpeg) może to być cholernie szybkie nawet dla plików> 100k.
Jeśli chcesz wdrożyć mądrzejszy / bardziej złożony proces, możesz spróbować eksperymentować z iteracyjną logiką ponownego kompresji / porównania wielkości w celu oszacowania oryginalnego profilu jakości (ponowne kompresowanie z tą samą jakością powinno dać w przybliżeniu ten sam rozmiar, z wysokim jakość powinna nieznacznie zwiększyć rozmiar, a przy niższej jakości powinna znacznie zmniejszyć rozmiar). Zużyłoby to oczywiście znacznie więcej mocy procesora.
źródło
Oryginalny nieskompresowany rozmiar to 2400 x 600 x 3 = 4 320 000 bajtów (4,1 MB), ponieważ 24-bitowy kolor to zawsze trzy bajty danych RGB na piksel . Nie ma możliwości obejścia tej absolutnej prawdy.
Jednak rozmiar JPG zależy również od szczegółów obrazu. Duże gładkie obszary (jak niebo lub pomalowane ściany) lepiej się kompresują, ale obszary bardziej szczegółowe (jak drzewo pełne liści) również nie kompresują się. Więc nie ma absolutnego wskaźnika liczbowego.
Ale 540 KB to 0,540 / 4,1 = 13% pierwotnego rozmiaru 4,1 MB . Może to być 29% poprzedniego rozmiaru JPG, ale jest to 13% pierwotnego rozmiaru nieskompresowanego. Jest to 1/8 oryginalnego rozmiaru nieskompresowanego, co zwykle uważa się za „przyzwoitą” jakość. Nie optymalna, nie maksymalna jakość, ale ogólnie przyzwoita, być może wystarczająco dobra do niektórych zastosowań. Mówiąc krótko, jest już mały.
Większy plik JPG oznacza lepszą jakość obrazu, a mniejszy oznacza niższą jakość obrazu. Musisz zdecydować, co jest wystarczająco dobre, ale JPG nigdy nie jest „zbyt duży”, ponieważ jakość obrazu spada wraz z kompresją JPG. Kolor 24-bitowy ma trzy bajty na piksel bez kompresji.
Więc decyzja zależy od tego, czy chcesz to małe, czy dobre.
Ale powiększanie istniejącego JPG jest jeszcze gorsze, ponieważ dodaje się więcej artefaktów JPG, a gdy są małe, dane są zmieniane i nigdy nie będzie lepiej.
Artefakty JPG zwykle pokazują dwa sposoby: widoczne bloki 8 x 8 pikseli jednego koloru w gładkich obszarach bez szczegółów lub jako widoczne szorstkie krawędzie wokół krawędzi detalu.
Podczas edycji i ponownego zapisywania pliku JPG dodawane są dodatkowe artefakty JPG. Jeśli jest to wymagane, dobrą praktyką jest zawsze ponowne zapisywanie w celu dopasowania do oryginalnego ustawienia kompresji.
źródło
„Zapisz dla Internetu” w Photoshopie jest naprawdę dobrym kompromisem między rozmiarem pliku a jakością, więc jeśli nie masz bardziej szczegółowych wymagań, powinieneś to zrobić. Typowy porady dla twórców stron jest, aby trzymać się 50-70% zakresu jakości. Oczywiście są wyjątki: będziesz chciał 90-95% jakości na logo firmy, które musi zawsze wyglądać świetnie (lub nawet przekonwertować je na format bezstratny), a nawet 30% na dużym, ale ledwo widoczne tło strony.
Nie zapomnij też przeskalować zdjęć. Obraz 2400 x 600 będzie wyglądał świetnie na ekranie 4K, ale zostanie przeskalowany na mniejszych ekranach, marnując przepustowość danych bez poprawy wizualnej dla użytkownika. Sprawdź szablon strony internetowej, którego będziesz używać, aby znaleźć optymalną szerokość zdjęć. Zazwyczaj w momencie pisania będzie to około 1200-1300 pikseli (zobacz najpopularniejszą rozdzielczość tutaj ).
Pamiętaj, aby zachować oryginalne obrazy przekonwertowane na jakość internetową. Jeśli kiedykolwiek będziesz musiał przerobić lub wydrukować ten materiał, będziesz żałować, że masz go tylko w 60% jakości i rozdzielczości 1 Mpix.
źródło