Zmierzone, nie obiecane
Wydajność
Każda liczba na tej stronie pochodzi z prawdziwych zdjęć na zwykłym laptopie (Apple M3, 16 GB), a skrypty, które ją dały, są w repozytorium, więc każdy może uruchomić je ponownie. Pod każdym wykresem jest wyjaśnienie, co oznacza on dla twoich odbitek, a na końcu – słowa stojące za liczbami.
Dlaczego Fotollection jest szybkie
Żadnej magii. Kilka decyzji podjętych przed pierwszą linijką kodu, każda zmierzona.
Kod natywny na każdym rdzeniu
Praca Fotollection odbywa się w Ruście, skompilowanym dla twojego procesora i rozłożonym na wszystkie jego rdzenie, z instrukcjami wektorowymi (SIMD), które procesory oferują do pikseli.1,2,3
23,5 / seksportowanych zdjęć 16 MP
Tylko to, co potrzebne
Otwarcie folderu odczytuje EXIF każdego pliku i jego małą wbudowaną miniaturę, nigdy całe zdjęcie. Miniatury są trzymane w pamięci podręcznej na dysku.4
0,12 sna otwarcie 1000 zdjęć
Nigdy więcej pikseli niż ekran
Podgląd ma najwyżej 1600 px i powstaje z kopii 2048 px trzymanej w pamięci. Pełne zdjęcie jest wczytywane dopiero przy powiększeniu, fragment po fragmencie.
17 msna odświeżenie podglądu
Gotowe, zanim klikniesz
Gdy miniatury są gotowe, podgląd każdego zdjęcia jest przygotowywany w tle i trzymany na dysku, a jedna czwarta pamięci przechowuje zdjęcia wokół tego na ekranie.
27 msna otwarcie dowolnego zdjęcia
Nic nie jest robione dwa razy
Suwak koloru zmienia tylko kolor, nigdy rozmiar. Wszystkie suwaki koloru są składane w jedną tablicę 33 × 33 × 33 kolorów, więc dziesięć suwaków kosztuje tyle co jeden.
2 msdla dziesięciu suwaków koloru na podglądzie
Pamięć w budżecie
Fotollection pracuje naraz tylko na tylu pełnowymiarowych zdjęciach, na ile pozwala jego budżet pamięci, ustalany według największego zdjęcia w eksporcie.
1,45 GBszczytowe zużycie pamięci przy 5035 zdjęciach
Kodery dostrojone pomiarami
Pliki do druku pomijają optymalizację tablic, która zmniejszała je o mniej niż 1 %, a kosztowała jedną trzecią czasu kodowania.
−33 %czasu kodowania plików do druku
Karta graficzna podczas edycji
Gdy suwak koloru się przesuwa, karta graficzna rysuje z tablicy, którą buduje rdzeń. Eksporty zostają na procesorze, więc odbitka jest identyczna na każdym komputerze.
1–2 msna krok suwaka, zamiast 26 ms
Do 20× szybciej. Nowy sposób korzystania z pamięci.
v0.11.0 od nowa układa sposób, w jaki Fotollection przechowuje twoje zdjęcia. Podgląd każdego zdjęcia jest przygotowywany w tle, gdy tylko gotowa jest jego miniatura, i trzymany na dysku, jedna czwarta pamięci komputera przechowuje zdjęcia wokół tego, które widzisz, a zdjęcie na ekranie zawsze ma pierwszeństwo. Efekt: każde zdjęcie, bliskie czy dalekie, JPEG czy RAW, otwiera się w 27 milisekund. Otwarcie RAW-a jest do 20 razy szybsze niż w v0.9.0, a JPEG-a 10 razy szybsze, zmierzone na tych samych 422 zdjęciach z jednej podróży.5,6
Wcześniej: każde zdjęcie dekodowane w chwili kliknięcia
Do v0.10.0 podgląd powstawał wtedy, gdy o niego prosiłeś: odczyt pliku, dekodowanie zdjęcia (wywołanie RAW-a), obrót do pionu, zmniejszenie do 2048 px i konwersja do sRGB, a potem kadrowanie, kolor, data na zdjęciu i kodowanie na ekran. Dla zdjęcia 20 MP z Lumix GX9 trwało to od 274 do 278 ms dla JPEG-a i od 440 do 531 ms dla RAW-a, za każdym razem, gdy otwierało się zdjęcie spoza ostatnich ośmiu. Wystarczająco szybko dla jednego zdjęcia; za wolno, by przeglądać całą podróż.
Standardowe podglądy, takie jak w Lightroomie
Od v0.11.0 praca, na którą użytkownik czeka, jest wykonywana, zanim o nią poprosi. Gdy miniatury folderu są gotowe, Fotollection w tle tworzy kopię 2048 px każdego zdjęcia, po jednym zdjęciu na wątek, i trzyma ją na dysku obok miniatur jako JPEG o rozmiarze około 0,66 MB (około 280 MB dla całej podróży). Kliknięcie dowolnego zdjęcia, bliskiego czy dalekiego, w tej sesji lub następnej, zaczyna od tej kopii: 27 ms zarówno dla JPEG-a, jak i dla RAW-a. Zostaje tylko własna praca podglądu (kadrowanie, zmiana rozmiaru, kolor, data na zdjęciu i kodowanie), te same 27 ms co z pamięci. Podgląd zrobiony z kopii na dysku różni się od świeżego średnio o 1,35 poziomu na 255, za mało, by to zobaczyć.8
Pamięć użyta dobrze, a nie jak najoszczędniej
Przeglądarka zdjęć, która na laptopie z 16 GB trzyma w pamięci osiem zdjęć, marnuje laptopa. Fotollection daje teraz podglądowi jedną czwartą pamięci komputera (na Macu z 16 GB to około 190 zdjęć w 2048 px, 20 wywołań RAW zachowanych dla ich suwaków i 600 MB na zoom), liczoną w bajtach i zwalnianą od najstarszych. Gdy zdjęcie jest na ekranie, wczytywane są też dwa następne w kierunku, w którym się przesuwasz, i jedno za nim, więc klawisze strzałek nigdy nie czekają. Pułap 2 GB nadal obowiązuje przy eksporcie.
Zdjęcie na ekranie idzie pierwsze
Naraz wywoływany jest tylko jeden RAW, tak by partia zdjęć RAW zmieściła się w pamięci. Wcześniej kolejność w kolejce była kwestią szczęścia: przygotowywany podgląd, szacowanie rozmiaru eksportu albo sam eksport mogły kazać czekać zdjęciu, które kliknąłeś. Teraz każde wywołanie mówi, kto na nie czeka, a praca w tle ustępuje, ilekroć zdjęcie na ekranie czegoś potrzebuje. Ta sama praca ujawniła też dwa rzadkie zawieszenia, których już nie ma: jedno, w którym każdy wątek czekał na wywołanie, dla którego nie został żaden wolny wątek, i drugie, w którym ekran czekał na obraz, o który nigdy nie poprosił.
| Wersja | JPEG p50 / p95 | RAW p50 / p95 | Jak |
|---|---|---|---|
| v0.9.0 | 274 / 286 ms | 531 / 550 ms | Dekodowane przy kliknięciu; RAW przez macOS |
| v0.10.0 | 278 / 293 ms | 440 / 471 ms | Dekodowane przy kliknięciu; RAW przez nasze własne wywołanie |
| v0.11.0 | 27 / 32 ms | 27 / 30 ms | Ze standardowego podglądu na dysku lub z pamięci |
Zmierzone na zdjęciach z praskiej podróży właściciela projektu (396 JPEG i 26 RAW, 20 MP) na Apple M3 za pomocą measure_browse: v0.9.0 zbudowane z własnego tagu, v0.10.0 na kodzie tuż przed tą zmianą.
Szybkość: tysiąc zdjęć w mgnieniu oka
Otwarcie folderu odczytuje EXIF każdego zdjęcia i jego małą wbudowaną miniaturę, a nie cały obraz, a zmiana ustawienia odświeża tylko podgląd. Natywny Rust wygrywa też z przeglądarką internetową wykonującą to samo zadanie: ta sama szybkość eksportu, szybszy podgląd i o jedną czwartą mniej pamięci.9
Co się dzieje, gdy otwierasz folder
Folder zdjęć nie jest czytany w całości. Z każdego pliku Fotollection czyta dane EXIF (datę, aparat, miejsce) i małą miniaturę, którą każdy aparat zapisuje w pliku, i nic więcej: 1000 zdjęć zajmuje 0,12 s, przy budżecie 1 s ustalonym, zanim napisano kod. Ostrzejsze miniatury 400 px powstają potem w tle, na dwóch wątkach, by Fotollection pozostało szybkie, i trafiają do pamięci podręcznej na dysku, więc ponownie otwarty folder pojawia się natychmiast. Dla 5035 zdjęć import zajął 383 ms, a wbudowane miniatury 236 ms.
Na co idzie 17 ms podglądu
Zmiana ustawienia renderuje podgląd ponownie z kopii zdjęcia 2048 px trzymanej w pamięci, nigdy z pełnego pliku. Z 16,7 ms, które to trwa, kadrowanie i zmiana rozmiaru filtrem Lanczos zajmują 9,7 ms, data na zdjęciu poniżej 0,1 ms, a kodowanie podglądu jako JPEG na ekran 7,0 ms. Ten koder dostrojono pomiarami: z ustawieniami eksportu (pełna rozdzielczość koloru i zoptymalizowane tablice) potrzebował 16,2 ms; ekran ich nie potrzebuje, więc podgląd używa połowy rozdzielczości koloru i zwykłych tablic, a eksport zachowuje pełny kolor (4:4:4). Wypróbowano tańszy filtr zmiany rozmiaru, który okazał się na tym procesorze wolniejszy (12,5 ms), więc Lanczos został.
Kod natywny kontra przeglądarka
To samo zadanie (dekodowanie, kadr 2:3, data na zdjęciu, JPEG w jakości 95) uruchomiono na tych samych 95 zdjęciach w Fotollection i w Chromium, z jednym workerem na rdzeń. Szybkość eksportu wyszła taka sama, 18,0 wobec 17,9 zdjęcia na sekundę, co obaliło nasze pierwsze przypuszczenie: przeglądarka nie jest wolna. Powody, by pisać kod natywny, leżą gdzie indziej: Fotollection zapisuje pliki 4:4:4 w pełnej rozdzielczości koloru tam, gdzie koder przeglądarki ją połowi, zachowuje profil kolorów każdego zdjęcia, zapisuje pliki prosto na dysk i zużyło o jedną czwartą mniej pamięci (1,35 GB wobec 1,78 GB). Od tamtej pory koder do druku przyspieszył jeszcze bardziej: 23,5 zdjęcia na sekundę przy 16 MP.
Karta graficzna przy edycji, każdy rdzeń przy eksporcie
Gdy przeciągasz suwak koloru, karta graficzna rysuje look z tej samej tablicy, którą buduje rdzeń Fotollection, a gdy go puścisz, przejmuje dokładny render. Eksporty zostają na procesorze, więc odbitka wychodzi taka sama na każdym komputerze.
Dziesięć suwaków w cenie jednego
Każdy suwak koloru (jasność, kontrast, ciepło, nasycenie, wyblaknięcie, tonowanie cieni i świateł, czerń i biel) jest składany w jedną tablicę 33 × 33 × 33 kolorów: 35 937 punktów, które mówią, dokąd trafia każdy kolor. Nałożenie jej na zdjęcie polega na znalezieniu komórki tablicy dla każdego piksela i interpolacji między czterema jej narożnikami (interpolacja czworościenna), więc dziesięć suwaków kosztuje tyle co jeden. Zbudowanie tablicy przy ustawionych wszystkich suwakach trwa około 2,6 ms; nałożenie jej na podgląd 1600 px – poniżej 2,2 ms; na eksport 24 MP – około 24 ms.
Dlaczego przeciąganie wciąż wydawało się wolne i co zmieniła karta graficzna
Mierzone krok po kroku, jedno przesunięcie suwaka kosztowało około 26 ms, a sam kolor stanowił z tego tylko 2 ms: resztę zajmowało kodowanie podglądu jako JPEG (7 do 11 ms) i ponowne dekodowanie go przez okno (9 do 15 ms). Karta graficzna usuwa oba te kroki. Gdy zaczyna się przeciąganie, zwykły podgląd i maska tego, gdzie jest zdjęcie (a nie data na zdjęciu, ramka czy obramowanie), trafiają do karty graficznej raz; przy każdym kroku idzie za nimi tylko nowa tablica, a mały program WebGL2 interpoluje ją dokładnie tak jak rdzeń: 1 ms na krok w WebKit systemu macOS, 2 ms w Chromium. Gdy puszczasz suwak, zastępuje go dokładny render rdzenia. Oba porównano na mocnym looku z przesuniętymi wszystkimi suwakami: różnią się średnio o 0,13 w ΔE2000 i o 0,77 na 99. percentylu, daleko poniżej 1, którą oko widzi przy porównaniu obok siebie.
Nie trzeba niczego przełączać. Przy pierwszym przeciągnięciu Fotollection sprawdza samo: jeśli nie ma WebGL2, renderer jest programowy albo krok testowy trwa 8 ms lub dłużej, zostaje na ścieżce procesora do końca sesji. Renderer programowy potrzebował w teście 16,5 ms na krok, więc słusznie zostaje wtedy na procesorze.
Eksport na wszystkich rdzeniach
Dekodowanie i kodowanie zdjęcia działają na jednym rdzeniu każde, więc eksport jest szybki, gdy przetwarza się kilka zdjęć naraz. Ile – to zależy od pamięci: na zdjęciach 24 do 26 MP 2 naraz dawały 4,9 zdjęcia na sekundę, 4 – 9,4, 6 – 11,5, a 8 – 12,5, przy pamięci rosnącej z 0,49 do 1,21 GB. Fotollection wybiera tę liczbę z budżetu pamięci 1,6 GB i rozmiaru największego zdjęcia i zatrzymuje się na 6, bo na zdjęciach z prawdziwej podróży 8 naraz nie było szybsze, a zużywało o 0,2 GB więcej. Eksport nigdy nie używa karty graficznej: odbitka musi wyjść taka sama na każdym komputerze, a od tego zależą testy porównujące eksporty bajt po bajcie.
Prawdziwa podróż: 422 pliki z Pragi
Zestawy testowe potrafią schlebiać, więc oto jeden folder dokładnie taki, jaki zszedł z aparatu Lumix GX9 po weekendzie w Pradze: 396 JPEG-ów 20 MP, każdy około 11 MB, i 26 plików RAW obok nich, łącznie 4,7 GB. Otwarcie go odczytuje EXIF każdego pliku w 0,23 sekundy. Podgląd renderuje się ponownie w 19 ms, RAW wywołuje się w 0,35 sekundy, a dziesięć pocztówek odświeża się w 21 ms. 2026-11-03 dwie liczby przekroczyły budżet na tych dużych plikach: eksport szedł w tempie 7,6 zdjęcia na sekundę, a szczytowe zużycie pamięci sięgnęło 2,14 GB. Przyczynę znaleziono i usunięto w v0.9.7: JPEG-i eksportują się teraz w tempie 10,1 na sekundę, a cały przebieg mieści się poniżej 1,31 GB.10,11
Dwa przekroczone budżety i ich przyczyny
Na tych plikach 20 MP pierwszy przebieg przekroczył dwa budżety: eksport szedł w tempie 7,6 zdjęcia na sekundę, a pamięć sięgnęła szczytu 2,14 GB, ponad pułap 2 GB. Zmierzenie czasu każdego etapu jednego zdjęcia pokazało, gdzie to idzie: dekodowanie około 100 ms, kadrowanie 2 ms, a kodowanie odbitki 203 ms. Koder do druku optymalizował swoje tablice w drugim przebiegu, który trzymał w pamięci każdy współczynnik obrazu – około 160 MB na zdjęcie, przy sześciu zdjęciach naraz około 1,5 GB – dla plików mniejszych zaledwie o 0,9 %. Ze standardowymi tablicami zapisuje plik pasami: 138 ms, ten sam błąd względem wyrenderowanego obrazu, kilka kilobajtów więcej.
Część pamięci w ogóle nie należała do Fotollection. Benchmark tworzył miniatury na wszystkich rdzeniach, podczas gdy Fotollection używa dwóch wątków w tle, i utrzymywał przy życiu własne pomiary podglądu przez cały eksport; mierzone tak, jak działa Fotollection, przed rozpoczęciem eksportu zostaje od 0,35 do 0,39 GB. Od v0.9.7 liczba zdjęć przetwarzanych naraz zależy też od największego zdjęcia w eksporcie (mniej przy bardzo dużych), więc szczyt pozostaje poniżej pułapu przy każdym rozmiarze: 10,1 zdjęcia na sekundę i 1,31 GB dla tego folderu.
Pamięć: 5035 zdjęć, a zużycie stoi w miejscu
Fotollection trzyma w pamięci tylko kilka bajtów na zdjęcie, zapisuje miniatury w pamięci podręcznej na dysku i pracuje naraz tylko na tylu pełnowymiarowych obrazach, ile mieści się w jego budżecie pamięci. Dlatego zużycie pamięci stoi w miejscu, nawet gdy podróż rośnie do tysięcy zdjęć.
Dlaczego pamięć nie rośnie razem z folderem
Fotollection trzyma w bibliotece kilka bajtów na zdjęcie (13 MB dla 5035 zdjęć), zapisuje miniatury w pamięci podręcznej na dysku zamiast trzymać je w pamięci, trzyma w pamięci ograniczoną liczbę podglądów i pracuje naraz tylko na tylu pełnowymiarowych zdjęciach, ile mieści się w jego budżecie. Siatka na ekranie jest wirtualna: istnieją tylko kafelki, które widzisz. Aby to sprawdzić, te same 95 zdjęć podlinkowano 53 razy w folderze z 5035 plikami:
| 95 zdjęć | 5035 zdjęć | |
|---|---|---|
| Import i EXIF | 5 ms, 7 MB | 383 ms, 13 MB |
| Miniatury 400 px do pamięci podręcznej na dysku | 47,8 zdjęcia/s | 46,4 zdjęcia/s |
| Eksport, 6 naraz | 18,0 zdjęcia/s | 15,4 zdjęcia/s, 0 nieudanych |
| Szczytowa pamięć całego przebiegu | 1,35 GB | 1,45 GB |
53 razy więcej zdjęć kosztowało 0,1 GB więcej. Długi eksport jest nieco wolniejszy na zdjęcie tylko dlatego, że trwał ponad pięć minut, a procesor laptopa zwalnia pod długotrwałym obciążeniem.
Jakość druku: odbitka wygląda jak zdjęcie
Odbitki zrobione przez edytor internetowy często wyglądają płasko: usuwa on profil kolorów, zmniejsza zdjęcie do 2000 px i zapisuje je w jakości 80 z kolorem w połowie rozdzielczości. Fotollection zachowuje profil i eksportuje w pełnej rozdzielczości w 4:4:4.
Dlaczego odbitki z edytora internetowego wyglądają płasko
Test eksportuje 20 zdjęć z aparatu i 5 wersji w Display P3 (szerszej gamie kolorów najnowszych telefonów i Maców) przez prawdziwy eksport Fotollection, a następnie odczytuje oba pliki niezależnym dekoderem, przelicza je do CIELAB przez ich profile kolorów i porównuje piksel po pikselu z oryginałem. Typowy eksport z edytora internetowego przechodzi to samo porównanie: profil usunięty, zmniejszenie do 2000 px i powiększenie z powrotem do odbitki, zapis w jakości 80 z połową rozdzielczości koloru (4:2:0).
| Mediana | Fotollection, sRGB | Edytor internetowy | Fotollection, Display P3 | Edytor internetowy |
|---|---|---|---|---|
| ΔE2000 (błąd koloru, poniżej 1 jest niewidoczny) | 0,19 | 1,39 | 0,31 | 2,15 |
| PSNR | 52,6 dB | 37,9 dB | 50,8 dB | 37,0 dB |
| Zachowane nasycenie | 100 % | 99,9 % | 99,9 % | 86,8 % |
| Zachowane drobne szczegóły | 99,8 % | 13 % | 100 % | 18 % |
Płaski wygląd tłumaczą dwie przyczyny. Zmniejszenie do 2000 px i ponowne powiększenie dla laboratorium wyrzuca 87 % drobnych szczegółów, dzięki którym odbitka wygląda ostro. A usunięcie profilu kolorów każe odczytać zdjęcie w Display P3 tak, jakby było w sRGB, co zabiera 13 % jego nasycenia. Fotollection zachowuje profil (25 z 25 plików), eksportuje w pełnej rozdzielczości zdjęcia z pełnym kolorem (4:4:4) w jakości 95 (tak zmierzono wtedy; od v0.13.0 domyślnie 90, wciąż poniżej widocznej różnicy), a jego większe błędy występują tylko na ostrych krawędziach, gdzie każdy JPEG pracuje najciężej. Jeszcze przed nami: prawdziwe pliki HEIC z iPhone’a i odbitki zmierzone spektrofotometrem.
RAW z aparatu: otwórz go takim, jaki jest
Fotollection otwiera pliki RAW z dziewięciu popularnych aparatów takie, jakie są, bez konwersji, a na Windows i Linuksie bez instalowania czegokolwiek. Od v0.10.0 pełny obraz to własne wywołanie Fotollection dla każdego aparatu z matrycą Bayera, wykonane na danych samego aparatu, jak w edytorze RAW, podczas gdy Adobe DNG Converter tylko zamienia jeden plik RAW w inny.12,13,14,15
Co naprawdę rejestruje matryca
Matryca aparatu to siatka milionów maleńkich studzienek zwanych fotodiodami. Gdy migawka jest otwarta, każda z nich zbiera docierające do niej światło i zamienia je w ładunek elektryczny; gdy się zamyka, przetwornik zamienia każdy ładunek w liczbę. Ta zależność jest liniowa: dwa razy więcej światła daje dwa razy większą liczbę. Nasze oczy wcale nie są liniowe, oceniają jasność proporcjonalnie, i dlatego plik RAW wygląda ciemno i płasko, dopóki nie zostanie wywołany.
Tę siatkę odczytują dwa rodzaje matryc:
- CCD (charge-coupled device) przesuwa ładunek każdej fotodiody, rząd po rzędzie, do jednego wzmacniacza na krawędzi układu. Była to matryca pierwszych aparatów cyfrowych i wielu wczesnych cyfrowych ścianek średnioformatowych: czyste obrazy, ale powolny odczyt i duży apetyt na energię.
- CMOS daje każdej fotodiodzie własny wzmacniacz i odczytuje wiele z nich naraz. Jest szybsza, zużywa mniej energii i jest tańsza w produkcji, więc ma ją dziś niemal każdy aparat i telefon. Większość matryc CMOS odczytuje rzędy jeden po drugim, dlatego szybko poruszający się obiekt może się pochylić na zdjęciu zrobionym migawką elektroniczną (rolling shutter), a matryce warstwowe (stacked), odczytywane znacznie szybciej, pochylają go mniej.
Te liczby mają znacznie więcej stopni niż JPEG. Aparat zapisuje 12 lub 14 bitów na fotodiodę, 4096 lub 16 384 poziomy, podczas gdy JPEG przechowuje 8 bitów, 256 poziomów. To te dodatkowe poziomy pozwalają rozjaśnić cień albo przyciemnić jasne niebo bez pasm. A brak światła to nie zero: każda matryca dodaje niewielkie przesunięcie, poziom czerni, by szum wokół czerni nie został ucięty. W próbce z Nikona D750 czerń to 600, a najjaśniejsza wartość, jaką matryca może zapisać, poziom bieli, to 15 520. Pierwsze, co robi każdy wywoływacz RAW, to sprowadzenie tych dwóch liczb do 0 i 1, osobno dla każdej pozycji filtra kolorów, bo niektóre aparaty dają każdej z nich własny poziom czerni.
Kolor bierze się z filtra nad każdą fotodiodą
Fotodioda mierzy tylko, ile światła dociera, nigdy jego kolor. Aby widzieć kolor, matryca jest pokryta mozaiką filtrów barwnych: maleńkim czerwonym, zielonym lub niebieskim filtrem nad każdą fotodiodą, więc każda liczy tylko część widma.
- Bayer, opatentowany przez Bryce’a Bayera w Kodaku w 1976 roku, powtarza kwadrat 2 × 2: jeden czerwony, dwa zielone, jeden niebieski. Połowa fotodiod jest zielona, bo nasze oczy czerpią większość poczucia szczegółu ze środka widma, więc zieleń niesie większość ostrości. Niemal każdy aparat używa tego wzoru, w jednej z czterech orientacji (RGGB, BGGR, GRBG, GBRG), którą plik musi podać.
- X-Trans, wzór Fujifilm od 2012 roku, powtarza kwadrat 6 × 6 z czerwienią, zielenią i błękitem w każdym rzędzie i każdej kolumnie. Jego nieregularny układ zmniejsza ryzyko kolorowej mory na drobnych powtarzających się detalach, więc Fujifilm może pominąć filtr rozmywający, który ma wiele matryc, kosztem trudniejszej rekonstrukcji.
- Inne konstrukcje: matryce monochromatyczne nie mają żadnego filtra, więc każda fotodioda widzi pełny szczegół (aparaty Monochrom Leiki); Foveon Sigmy układa trzy warstwy, które pochłaniają kolor na różnych głębokościach krzemu; wiele telefonów grupuje po cztery fotodiody jednego koloru (Quad Bayer) i w słabym świetle odczytuje je jako jedną.
Matryca Bayera 24 MP zapisuje więc 24 miliony liczb, każdą dla jednego koloru: brakuje dwóch z trzech kolorów każdego piksela. Zamiana tej mozaiki w obraz to zadanie demozaikowania, opisanego niżej.
Co zawiera plik RAW
JPEG to gotowy obraz: aparat podjął już wszystkie decyzje. Plik RAW przechowuje liczby z matrycy sprzed tych decyzji, ze wszystkim, co potrzebne, by podjąć je później:
- same próbki, po jednej na fotodiodę, i kolor filtra, pod którym leżała każda z nich;
- poziomy czerni i bieli;
- obszar aktywny (fotodiody, które widziały światło; kilka rzędów i kolumn na brzegach jest celowo zasłoniętych, by mierzyć czerń) oraz domyślny kadr aparatu;
- balans bieli, który aparat wybrał w chwili zrobienia zdjęcia;
- macierze kolorów, które mówią, jak własna czerwień, zieleń i błękit tej matrycy mają się do kolorów, które widzą ludzie;
- podgląd, JPEG zrobiony przez sam aparat, z jego własnym kolorem i tonacją, plus dane EXIF.
Każdy producent ma własny format, przeważnie oparty na TIFF i częściowo nieudokumentowany: CR2 i CR3 (Canon), NEF (Nikon), ARW (Sony), RW2 (Panasonic), ORF (Olympus), RAF (Fujifilm). DNG to format, który Adobe publikuje otwarcie (wersja 1.7), używany przez Ricoh, Leikę, Pentaxa i wiele telefonów, i to jego reguł trzyma się ta strona.
Fotollection czyta DNG własnym czytnikiem, napisanym na podstawie specyfikacji, a pozostałe formaty rozpakowuje rawler, biblioteka na licencji LGPL wbudowana w Fotollection. Miniatury w siatce w ogóle nie dotykają danych z matrycy: pochodzą z podglądu zapisanego w pliku, w 9 do 32 ms, i dlatego folder plików RAW otwiera się tak szybko jak folder JPEG-ów.
Demozaikowanie: odtworzenie dwóch brakujących kolorów
Odtwarzanie dwóch brakujących kolorów każdego piksela z jego sąsiadów nazywa się demozaikowaniem i to ono bardziej niż jakikolwiek inny krok decyduje, jak ostre i czyste wygląda zdjęcie RAW. Każda metoda staje przed tym samym dylematem: uśrednianie sąsiadów jest bezpieczne na płaskich obszarach, ale na krawędzi miesza dwie różne powierzchnie, więc cała sztuka polega na tym, by wiedzieć, którzy sąsiedzi do siebie pasują.
- Bilinear po prostu uśrednia najbliższe fotodiody każdego koloru. To poziom odniesienia, z którym porównuje się każdą metodę: miękki obraz i kolorowe obwódki wzdłuż każdej ostrej krawędzi, bo czerwień, zieleń i błękit są uśredniane w nieco różnych miejscach.
- Malvar–He–Cutler (2004) zaczyna od tej średniej i koryguje ją szczegółem koloru, który fotodioda widziała, przez stałe filtry 5 × 5. Jest ostrzejsza i nadal bardzo szybka. Fotollection wywoływało nią do v0.10.0.
- PPG (patterned pixel grouping) najpierw ustala, w którym kierunku obraz zmienia się najmniej, i interpoluje tylko wzdłuż tego kierunku. Używa jej rawler, a do v0.10.0 także wersje Fotollection na Windows i Linuksa dla większości formatów.
- RCD (ratio corrected demosaicing, autorstwa Luisa Sanza Rodrígueza) pracuje na stosunkach między kolorami zamiast na różnicach, co lepiej sprawdza się zarówno w jasnych, jak i ciemnych partiach, i słynie z niewielu artefaktów na drobnych detalach; oferują ją darktable i RawTherapee.
- Markesteijn, od nazwiska Franka Markesteijna, to metoda stworzona dla X-Trans, w jednym przebiegu lub, wolniej i czyściej, w trzech.
- Demozaikowanie Fotollection od v0.10.0 przejmuje od RCD sposób wyboru kierunku, a następnie szacuje zieleń z każdej strony, skorygowaną własnym kolorem danego miejsca (jak u Hamiltona i Adamsa), ważoną tym, jak bardzo zmienia się każda strona. Najpierw napisaliśmy własny krok stosunków z RCD i na naszych tablicach testowych wypadł gorzej, więc w aplikacji trafia wariant, który wygrał, pod własną nazwą.
Gdy metoda zgaduje źle, widać to na cztery typowe sposoby:
- zipper (zamek błyskawiczny): rząd naprzemiennie jasnych i ciemnych pikseli wzdłuż ostrej krawędzi, gdzie metoda wzięła sąsiadów z obu stron;
- labirynt: drobny, robaczkowaty wzór na płaskich obszarach, gdy dwie zielenie kwadratu Bayera nie odczytują się całkiem tak samo (leżą w rzędach o różnych sąsiadach i na wielu matrycach różnią się o procent lub dwa);
- fałszywy kolor: kolorowe kropki lub obwódki na detalach, które naprawdę są szare, jak tkanina, włosy, ceglany mur czy odległe ogrodzenie;
- mora: kolorowe fale na bardzo drobnych powtarzających się wzorach, drobniejszych, niż filtr barwny jest w stanie próbkować.
Jak oceniamy metodę. Oko łatwo dać się zwieść wynikowi, który wygląda ostrzej, więc każdą metodę ocenia się na obrazach, których prawda jest dokładnie znana. Komputer rysuje pięć tablic testowych w 768 px: płytkę strefową (pierścienie, które drobnieją ku brzegowi, aż do najdrobniejszego detalu, jaki mogą utrzymać zielone fotodiody), gwiazdę Siemensa z 72 ramionami, paski nasyconego koloru na szarym tle w trzech kierunkach, płynne przejścia kolorów oraz płaską szarość z dwiema zieleniami różniącymi się o 2 %. Każda jest zamieniana w to, co zapisałaby matryca Bayera, demozaikowana i porównywana z oryginałem. PSNR mierzy ogólny błąd w decybelach (więcej znaczy lepiej; każde 6 dB to błąd o połowę mniejszy); fałszywy kolor to średni kolor, który pojawia się na szarych tablicach; błąd krawędzi to średni błąd w odległości do 2 px od krawędzi.
| Tablica (768 px) | Bilinear | Malvar (nasza do v0.10.0) | Nasza od v0.10.0 |
|---|---|---|---|
| Płytka strefowa: PSNR, więcej znaczy lepiej | 13,0 dB | 17,3 dB | 16,5 dB |
| Płytka strefowa: fałszywy kolor, mniej znaczy lepiej | 65,9 | 43,0 | 18,7 |
| Gwiazda Siemensa: PSNR | 21,3 dB | 25,2 dB | 37,9 dB |
| Gwiazda Siemensa: fałszywy kolor | 9,4 | 8,4 | 0,16 |
| Paski nasyconego koloru: błąd wzdłuż krawędzi, mniej znaczy lepiej | 11,6 | 21,6 | 10,5 |
| Płynne przejścia: PSNR | 78,9 dB | 77,5 dB | 78,4 dB |
| Płaska szarość z różnicą zieleni: labirynt, mniej znaczy lepiej | 0,38 | 0,38 | 0 |
| Tekstura z martwymi pikselami: pozostałe na 10 000, mniej znaczy lepiej | 35,8 | 66,5 | 0 |
Malvar jest o około 4 dB lepsza od metody bilinear na drobnych szarych detalach, jak obiecuje jej publikacja, ale gorsza wzdłuż krawędzi między mocnymi kolorami, bo jej korekta pożycza szczegół jednego koloru dla pozostałych i zakłada, że zmieniają się razem, czego czerwony znak na szarym murze nie robi. Żadna z nich nie usuwa labiryntu, który nie jest problemem demozaikowania, lecz różnicą między dwiema zieleniami, do wyrównania wcześniej. To właśnie te luki zamyka nasz łańcuch od v0.10.0: martwe piksele i nierównowaga zieleni są poprawiane, póki każde miejsce zawiera jeszcze tylko to, co zmierzyło, kierunkowe demozaikowanie odtwarza kolory, a mała mediana na różnicach kolorów usuwa pozostały fałszywy kolor. Na tablicach testowych wygrywa wszędzie poza ogólnym PSNR płytki strefowej, o 0,8 dB niższym niż u Malvar przy najdrobniejszych detalach, gdzie aliasing dotyka każdej metody; nawet tam jej fałszywy kolor spada o połowę. Na dziewięciu prawdziwych plikach zbliża wywołanie każdego aparatu z matrycą Bayera do JPEG-a z aparatu tak samo lub bardziej i kosztuje około 180 ms na 24 MP, wobec 40 ms u Malvar: kilka dziesiątych sekundy więcej na zdjęcie za odbitki z czystszymi detalami.
Od kolorów aparatu do twoich
Czerwień, zieleń i błękit aparatu to nie te z twojego ekranu: filtry każdej matrycy używają własnych barwników i nakładają się inaczej niż czopki naszych oczu. Macierze kolorów w pliku zamieniają kolory aparatu na CIE XYZ, standardowy model ludzkiego widzenia barw zdefiniowany w 1931 roku, a stamtąd na sRGB, przestrzeń kolorów większości ekranów i laboratoriów fotograficznych.
- Balans bieli jest pierwszy: wzmocnienie czerwieni i błękitu, tak by coś białego w scenie wyszło neutralne. Aparat zapisuje wybrane wzmocnienia, a Fotollection stosuje je przed demozaikowaniem, by różnice kolorów, na których opierają się powyższe metody, pozostały małe.
- DNG zwykle zawiera dwie macierze, jedną zmierzoną w ciepłym świetle żarowym, a drugą w świetle dziennym. Właściwa dla twojego zdjęcia leży pomiędzy: wywoływacz wylicza światło ujęcia z jego balansu bieli, jako temperaturę barwową, i miesza obie. Fotollection robi to samo dla pozostałych formatów, z macierzy, które rawler zna dla każdego modelu aparatu.
- Wszystko to dzieje się w świetle liniowym, na własnej skali matrycy, przed jakąkolwiek krzywą. Mieszanie, skalowanie i zmiana rozmiaru kolorów w świetle liniowym daje fizycznie poprawne wyniki; robienie tego po krzywej przyciemnia krawędzie i przesuwa kolory.
Wygląd aparatu. Własny JPEG aparatu nie jest neutralny: każdy producent dodaje swój kontrast, swoje kolory i odcienie skóry, a ten wygląd to część powodów, dla których ludzie wybierają markę. Od v0.10.0 zdjęcie RAW otwiera się w neutralnym renderingu, wiernym macierzy matrycy, z winietowaniem obiektywu i ekspozycją wybraną przez aparat; Like the camera’s JPEG jest o jedno kliknięcie dalej, w karcie RAW colour zdjęcia RAW, dla jednego zdjęcia lub dla wszystkich RAW-ów naraz. (Do v0.10.0 każdy RAW był dopasowywany do JPEG-a z aparatu; projekt zapisany wtedy zachowuje ten wygląd.) Ten wybór dopasowuje JPEG z aparatu na dwa sposoby, jedną krzywą i macierzą albo jedną krzywą na kanał, i zachowuje ten, który dla danego pliku wypada bliżej: na Nikonie D750 zmniejsza różnicę o połowę, z 2,26 do 1,16 w ΔE2000. Miniatury w siatce zachowują własny podgląd aparatu, jak w Lightroomie.
Tonacja: od liczb liniowych do obrazu
Liczby liniowe wyglądają na ekranie ciemno i matowo, bo podwojenie światła, które matryca zapisuje jako dwa razy większą liczbę, wydaje się nam jednym stopniem jasności. Krzywa tonalna zamienia skalę matrycy w obraz: ustawia średnią szarość, unosi cienie, łagodnie wygasza światła zamiast od razu je obcinać i nadaje obrazowi kontrast. Obraz jest potem zapisywany z krzywą sRGB (jego „gammą”), która przeznacza więcej z 256 poziomów JPEG-a na cienie, gdzie nasze oczy najbardziej zauważają stopnie.
Dwie korekty, które aparat robi w swoim JPEG-u, nie są zapisane w danych RAW, a obie mają znaczenie dla odbitek:
- Winietowanie obiektywu: każdy obiektyw jest ciemniejszy ku rogom. Fotollection mierzy, na ile aparat je rozjaśnił, z jego własnego podglądu, jako wzmocnienie promieniowe. Gdy nasze wywołanie DNG po raz pierwszy porównano z JPEG-iem z aparatu, środek był o około 4 L* za jasny, a rogi o 1,5 za ciemne; wzmocnienie promieniowe zmniejszyło różnicę z ΔE 3,8 do 2,67, a każdy obszar zdjęcia mieścił się w ±0,5 L*.
- Dystorsja: lekkie beczkowate lub poduszkowate zniekształcenie obiektywu. Aparaty Micro Four Thirds (Panasonic, Olympus) są projektowane tak, by korygował je aparat, a ich pliki zapisują, jak to zrobić. Na Macu takie pliki wywołuje macOS, który stosuje tę korektę; korekta w naszym własnym wywołaniu jest zaplanowana (FR-085).
Jak Fotollection wywołuje RAW, krok po kroku
Dla pełnego wywołania, tego, które stoi za podglądem wydruku, zoomem i eksportem:
- Rozpoznanie formatu po pierwszych bajtach pliku, nigdy po nazwie, więc plik o zmienionej nazwie albo RAW, który wygląda jak zwykły TIFF, jest nadal odczytywany poprawnie.
- Odczyt liczb z matrycy: DNG naszym własnym czytnikiem, pozostałe formaty rozpakowywane przez rawler. Plik zbyt duży lub uszkodzony jest odrzucany, zanim zostanie zdekodowany jakikolwiek piksel, z kodem błędu.
- Poziomy: czerń do 0, a biel do 1, dla każdej pozycji filtra kolorów, liczonej od rogu obszaru aktywnego.
- Balans bieli, potem demozaikowanie: najpierw martwe piksele i równowaga zieleni, potem kierunkowe demozaikowanie i mediana na fałszywy kolor (Markesteijn dla X-Trans pojawi się w v0.15.0).
- Kolor: macierze aparatu, zmieszane dla światła ujęcia, w świetle liniowym.
- Tonacja i wygląd, dopasowane do podglądu z aparatu, z jego winietowaniem obiektywu.
- Od tego miejsca zdjęcie RAW jest jak każde inne: kadr, data na zdjęciu, ramka, rozmiar odbitki i profil kolorów, eksport w pełnej rozdzielczości w 4:4:4 w jakości 95.
Kilka zasad obowiązuje przez cały czas. Naraz działa tylko jedno wywołanie, rozłożone na wszystkie rdzenie procesora i nigdy w wątku samego okna, więc Fotollection odpowiada dalej, gdy wywołuje się zdjęcie 30 MP. Eksport zawsze działa na procesorze, więc odbitka wychodzi taka sama na każdym komputerze; karta graficzna przyspiesza tylko to, co widzisz podczas edycji. A kod jest nasz własny, napisany na podstawie opublikowanych specyfikacji i publikacji naukowych, nie skopiowany z innych projektów, a potem sprawdzony: na syntetycznych tablicach testowych powyżej, na dziewięciu plikach RAW z dziewięciu aparatów (CC0, z raw.pixls.us) i przez celowe przycinanie i psucie plików, tak by zły plik dawał błąd, a nigdy awarię.
Od v0.10.0: własne wywołanie dla każdego aparatu z matrycą Bayera. rawler tylko rozpakowuje pliki, a cała reszta należy do Fotollection. Pełne wywołanie dziewięciu przykładowych plików, mediana z 3 pomiarów, na tym samym laptopie: nasze wywołanie z czystszym demozaikowaniem wobec prostszego z rawlera i wywołania macOS:
| Aparat (format) | Własne Fotollection | rawler | macOS |
|---|---|---|---|
| Panasonic GX9 (RW2, 20 MP) | 280 ms | 216 ms | 436 ms |
| Panasonic S5 (RW2, 24 MP) | 442 ms | 301 ms | 1044 ms |
| Olympus E-M10 III (ORF, 16 MP) | 308 ms | 364 ms | 1164 ms |
| Sony A7 III (ARW, 24 MP) | 372 ms | 241 ms | 488 ms |
| Canon R10 (CR3, 24 MP) | 494 ms | 360 ms | 1647 ms |
| Ricoh GR III (DNG, 24 MP) | 523 ms | 650 ms | — |
| Nikon D750 (NEF, 24 MP) | 502 ms | 402 ms | 412 ms |
| Canon 5D Mark IV (CR2, 31 MP) | 691 ms | 565 ms | 418 ms |
| Fujifilm X-T3 (RAF, 26 MP, X-Trans) | następny | 524 ms | 1339 ms |
Nasze wywołanie potrzebuje od jednej dziesiątej do jednej czwartej sekundy więcej niż rawler, za czystsze demozaikowanie i dopasowany kolor, i na większości aparatów pozostaje szybsze niż macOS; dzieje się to raz na zdjęcie, a suwak potem wykańcza zachowaną kopię w 4 do 11 ms. Na Macu pliki Panasonica i Olympusa zostają przy macOS ze względu na korektę obiektywu, dopóki nasze własne wywołanie nie zacznie korygować dystorsji. Szare pola z S5 wychodzą bardziej neutralne niż przez rawler (zafarb 1,42 wobec 2,43, gdzie 0 to idealna szarość). Fujifilm X-Trans pojawi się następny, z metodą Markesteijna, a po nim wywołanie na karcie graficznej dla podglądu, z wynikiem procesora jako wzorcem.
Podpowiedzi najlepszych ujęć: sprawdzone z wyborem człowieka
Posortowaliśmy ręcznie 95 prawdziwych zdjęć w 22 chwile i wybraliśmy najlepsze zdjęcie tam, gdzie było wyraźnie najlepsze. Następnie grupy i podpowiedzi Fotollection sprawdzono z tym wyborem.
Jak powstają podpowiedzi i jak je oceniono
Najpierw Fotollection szuka momentów. Zdjęcia są układane według czasu wykonania, z dokładnością do ułamka sekundy, a nowy moment zaczyna się, gdy przerwa jest dłuższa niż 2 sekundy lub czterokrotność zwykłej przerwy, gdy zmienia się aparat lub obiektyw albo gdy miejsce przesuwa się o więcej niż 30 m. Każde zdjęcie dostaje też mały podpis wizualny: rozkład jasnych i ciemnych partii oraz mieszankę kolorów. Ujęcie dołącza do momentu tylko wtedy, gdy wciąż przypomina poprzednie, z uwzględnieniem kroku w bok albo zbliżenia, które tłumaczy ogniskowa.
Następnie, w obrębie momentu, każde zdjęcie jest mierzone na pomniejszonej kopii: ostrość głównego motywu, poruszenie aparatu, ekspozycja (przepalone światła, zatopione cienie, jasność), szum, a tam, gdzie są twarze, także to, czy oczy są otwarte, a twarze zwrócone do aparatu. Każda miara jest porównywana tylko z innymi ujęciami tego samego momentu i ważona (ostrość motywu 35 %, otwarte oczy 20 %, poruszenie 15 %, ekspozycja 15 %, przepalone światła 10 %, reszta mniej), z najmniejszym progiem, tak by o wyborze nigdy nie przesądziła różnica zbyt mała, by zobaczyć ją na odbitce. Podpowiedź przychodzi z uzasadnieniem, nic nie jest usuwane, a wszystko działa na twoim komputerze: 17 ms na zdjęcie, 28 ms z twarzami.
Żeby wynik był uczciwy, 95 prawdziwych zdjęć posortowano ręcznie na 22 momenty, wskazując zdjęcie do zachowania dla 6 momentów, które miały wyraźnie najlepsze ujęcie. Każde ulepszenie oceniano względem tego wzorca:
| Krok | Znalezione momenty (z 22) | Błędne połączenia | Trafne wybory |
|---|---|---|---|
| Tylko odcisk obrazu | 3 | 0 | 2 z 2 |
| Plus rozkład i kolor | 13 | 0 | 3 z 4 |
| Plus zbliżenie z ogniskowej | 15 | 0 | 5 z 6 |
| Plus uczciwa ostrość i ukryte twarze | 15 | 0 | 6 z 6 |
Dwa różne momenty nigdy nie trafiają do jednej grupy; dwie dodatkowe grupy to pary oznaczone ręcznie jako niejednoznaczne. Momenty wciąż pomijane to te, w których poza lub kadr bardzo się zmienia, na przykład danie sfotografowane ponownie z drugiej strony.
Słowa stojące za liczbami
Żargon fotograficzny i drukarski, wyjaśniony tak, jak wyjaśnilibyśmy go przyjacielowi.
Co to jest ΔE (Delta E)?16
ΔE mierzy, jak bardzo dwa kolory różnią się dla ludzkiego oka, liczone w przestrzeni barw zbudowanej tak, by odpowiadała temu, jak widzimy (CIELAB, ze wzorem z 2000 roku). 0 oznacza kolory identyczne. Około 1 to najmniejsza różnica, jaką wprawne oko dostrzeże, patrząc na nie obok siebie; od 2 do 3 widzi większość ludzi; powyżej 5 kolory wyglądają na różne. Eksport do druku w Fotollection daje średnio 0,19.
Co to jest SSIM?17
SSIM, wskaźnik podobieństwa strukturalnego, porównuje kształty i faktury dwóch obrazów, a nie pojedyncze piksele, co jest bliższe temu, jak zauważamy rozmycie albo blokową kompresję. 1 oznacza obrazy identyczne. Powyżej około 0,98 większość ludzi nie odróżni ich bez powiększenia.
Ile kolorów mieści JPEG?6,18
JPEG zapisuje po 8 bitów na czerwony, zielony i niebieski: po 256 poziomów na każdy, czyli około 16,7 miliona kolorów. Z tego drukują też laboratoria fotograficzne. Pliki RAW z aparatu mają od 12 do 14 bitów, a nowsze iPhone'y potrafią zapisywać 10-bitowe HEIC, co pomaga przy edycji; na gotowej odbitce dobrze zrobiony 8-bitowy JPEG nie pokazuje schodków między tonami.
JPG czy JPEG? I czy używać PNG?
JPG i JPEG to ten sam format: stary Windows pozwalał tylko na trzyliterowe rozszerzenia. PNG jest bezstratny, więc nic nie zostaje odrzucone, ale zdjęcie zapisane jako PNG jest często od trzech do pięciu razy większe, a większość kiosków i laboratoriów oczekuje JPEG-a. JPEG w jakości 90 lub wyższej z pełną rozdzielczością koloru (4:4:4), taki, jaki Fotollection eksportuje do druku, jest na papierze nie do odróżnienia od oryginału.
Co znaczą 4:4:4 i 4:2:0?
Nasze oczy widzą szczegóły głównie w jasności, mniej w kolorze, więc JPEG może zapisać kolor w niższej rozdzielczości. 4:4:4 zachowuje pełną rozdzielczość koloru; 4:2:0 jej jedną czwartą, co zmniejsza pliki, ale zmiękcza kolorowe krawędzie, takie jak czerwony tekst albo niebieskie niebo za liśćmi. Odbitki zasługują na 4:4:4; media społecznościowe i tak kompresują wszystko ponownie do 4:2:0.
sRGB, Display P3, Adobe RGB i profile kolorów19,20,21
Profil kolorów mówi programowi, co znaczą liczby w pliku. sRGB to klasyczny zakres kolorów używany w internecie. Display P3, używany przez iPhone'y i nowsze aparaty, obejmuje około 25 % więcej kolorów, zwłaszcza czerwieni i zieleni. Jeśli zdjęcie P3 straci profil, jego liczby są czytane jako sRGB i wygląda ono na wyblakłe: to właśnie zmierzona przez nas utrata 13 % nasycenia. Adobe RGB, które niektóre aparaty oferują do pracy pod druk, też jest szersze niż sRGB, głównie w zieleniach i cyjanach. Fotollection zachowuje przy odbitkach profil, jaki ma zdjęcie, i poprawnie konwertuje do sRGB dla mediów społecznościowych.
Ile DPI potrzebuje odbitka?
DPI to liczba pikseli przypadających na każdy cal papieru. Przy 300 DPI odbitka wygląda ostro nawet z bliska; od 150 do 200 DPI wystarcza z odległości wyciągniętej ręki. Odbitka 10 × 15 cm przy 300 DPI potrzebuje 1800 × 1200 pikseli, więc wystarczy każde zdjęcie z telefonu czy aparatu; podpowiedź rozmiaru w aplikacji mówi, jak duże może być każde zdjęcie.
Dlaczego zdjęcia wyglądają gorzej na Facebooku?
Facebook zmniejsza każde zdjęcie do najwyżej 2048 px, kompresuje je ponownie w niższej jakości z kolorem w połowie rozdzielczości i usuwa profile kolorów. Zdjęcie, które przychodzi za duże, jest zmniejszane dwa razy: raz przez ciebie, raz przez Facebooka. Gdy wyślesz je już w 2048 px, w sRGB i lekko wyostrzone, Facebook kompresuje je tylko raz, a kolory są już właściwe.
Zmierz to sam
Wszystko da się odtworzyć na twoich własnych zdjęciach. Skrypty nigdy nie wysyłają ani nie kopiują żadnego zdjęcia; zachowywane są tylko liczby. Pełne tabele, z każdym przebiegiem, są w RESULT.md.
bench/run.sh ~/Pictures/some-folder 3
uv run bench/quality/audit.py ~/Pictures/some-folder /tmp/out
uv run bench/quality/share_audit.py ~/Pictures/some-folder /tmp/share