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.

  1. 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

  2. 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ęć

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

Gdzie odbywa się praca: Fotollection na twoim komputerze wobec typowego edytora internetowego
Gdzie odbywa się praca: Fotollection na twoim komputerze wobec typowego edytora internetowego

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

20×szybsze otwarcie zdjęcia RAW niż w v0.9.0 (531 → 27 ms)
10×szybsze otwarcie JPEG-a niż w v0.9.0 (274 → 27 ms)
27 msna otwarcie dowolnego zdjęcia, bliskiego czy dalekiego (budżet 100 ms)
Otwieranie zdjęcia: v0.9.0 i v0.10.0 wobec v0.11.0, na 422 zdjęciach z jednej podróży
Otwieranie zdjęcia: v0.9.0 i v0.10.0 wobec v0.11.0, na 422 zdjęciach z jednej podróży7
Skąd pochodzi podgląd zdjęcia: pamięć, potem dysk, potem plik
Skąd pochodzi podgląd zdjęcia: pamięć, potem dysk, potem plik

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

0,12 sna odczyt folderu z 1000 zdjęć, osiem razy poniżej budżetu
17 msna odświeżenie podglądu po zmianie
23,5zdjęcia 16 MP eksportowane na sekundę
Szybkość i pamięć wobec budżetów ustalonych przed napisaniem kodu
Szybkość i pamięć wobec budżetów ustalonych przed napisaniem kodu7
To samo zadanie w Fotollection i w przeglądarce internetowej
To samo zadanie w Fotollection i w przeglądarce internetowej7

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.

1–2 mskrok suwaka na karcie graficznej, wobec około 26 ms
0,13ΔE2000 między lookiem z karty a dokładnym renderem
10,8zdjęcia 26 MP eksportowane na sekundę, sześć naraz
Jeden krok suwaka koloru: procesor wobec karty graficznej
Jeden krok suwaka koloru: procesor wobec karty graficznej7
Szybkość eksportu a liczba zdjęć przetwarzanych naraz
Szybkość eksportu a liczba zdjęć przetwarzanych naraz7
Edycja na karcie graficznej, eksport na każdym rdzeniu procesora
Edycja na karcie graficznej, eksport na każdym rdzeniu procesora

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

0,23 sna otwarcie wszystkich 422 plików, razem z EXIF
19 msponowny render podglądu, p95 (budżet 50 ms)
0,35 sna wywołanie RAW-a 20 MP (mediana)
21 msna odświeżenie dziesięciu pocztówek (budżet 100 ms)
10,1 / seksportowanych JPEG-ów (budżet 8 / s)
1,31 GBszczytowe zużycie pamięci, JPEG i RAW (pułap 2 GB)

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ęć.

1,45 GBszczytowe zużycie pamięci przy 5035 zdjęciach
1,35 GBszczytowe zużycie pamięci przy 95 zdjęciach
53×więcej zdjęć za 0,1 GB więcej
Szczytowe zużycie pamięci, gdy partia rośnie do 5035 zdjęć
Szczytowe zużycie pamięci, gdy partia rośnie do 5035 zdjęć7

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.

0,19błąd koloru; oko zaczyna go zauważać przy 1
4:4:4pełna rozdzielczość koloru; edytor internetowy ją połowi
87 %drobnych szczegółów, które edytor internetowy traci przy 2000 px
Co eksport zachowuje z oryginału, wobec typowego edytora internetowego
Co eksport zachowuje z oryginału, wobec typowego edytora internetowego7

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.

Zdjęcia na Facebooka i Instagrama: lekkie, a wciąż to samo zdjęcie

Facebook zmniejsza każde zdjęcie do 2048 px, ponownie je kompresuje i ignoruje profile kolorów. Eksport do udostępniania najpierw porządnie wykonuje tę pracę, więc po Facebooku zdjęcie pozostaje bliższe sobie niż przy zwykłym sposobie.

99,6 %koloru zdjęcia Display P3 zachowane po Facebooku, wobec 86 %
2048 pxrozmiar, którego Facebook nie rusza
½pliku w Oryginalnym rozmiarze, każdy piksel zachowany
Zdjęcia na Facebooka: co widzą oglądający po ponownej kompresji przez Facebooka
Zdjęcia na Facebooka: co widzą oglądający po ponownej kompresji przez Facebooka7

Co Facebook robi ze zdjęciem i co robimy najpierw my

Facebook zmniejsza każde zdjęcie do najwyżej 2048 px, kompresuje je ponownie w jakości około 71 z połową rozdzielczości koloru i ignoruje profile kolorów. Eksport Share wykonuje tę pracę porządnie przed wysłaniem, więc Facebook nie ma już czego zmniejszać: zdjęcie jest konwertowane do sRGB przez swój profil, zmniejszane filtrem Lanczos w świetle liniowym, lekko wyostrzane i zapisywane w jakości 88. Każde ustawienie wybrano na podstawie pomiarów: mocniejsze wyostrzenie (0,35 zamiast 0,2) wypadło gorzej, a jakość 84 czy 80 traciła więcej, niż oszczędzała.

Mediana Original size Facebook, 2048 px Instagram, 1080 px
Rozmiar pliku (JPEG-i z aparatu po 3,08 MB) 1,42 MB 0,51 MB 0,24 MB
SSIM względem idealnego zmniejszenia (1 to identyczne) 0,981 0,979 0,982
ΔE2000 0,96 1,27 1,58

Po własnej ponownej kompresji Facebooka wynik pozostaje bliższy zdjęciu niż przy zwykłym sposobie (SSIM 0,965 wobec 0,961), a zdjęcie w Display P3 zachowuje 99,6 % swojego koloru zamiast 86 %, bo jego profil zamieniono na prawdziwe kolory sRGB, zamiast go usunąć. Presety ze zmniejszeniem pozostają powyżej ΔE 1 z powodu połowy rozdzielczości koloru, którą i tak stosuje każda platforma; Original size zachowuje każdy piksel przy mniej więcej połowie rozmiaru pliku, poniżej ΔE 1.

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

9–32 msminiatura RAW-a, z podglądu wewnątrz pliku
0,3–0,7 swłasne wywołanie pełnego zdjęcia w Fotollection
1,2–1,8 sAdobe DNG Converter na plik, tylko do konwersji
RAW z aparatu: od pliku do ekranu, dla każdego aparatu i wobec Adobe DNG Converter
RAW z aparatu: od pliku do ekranu, dla każdego aparatu i wobec Adobe DNG Converter7
Zdjęcie RAW, od pliku do odbitki
Zdjęcie RAW, od pliku do odbitki
Bramka wywoływania: zdjęcie na ekranie ma pierwszeństwo, praca w tle czeka
Bramka wywoływania: zdjęcie na ekranie ma pierwszeństwo, praca w tle czeka

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:

  1. 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.
  2. 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.
  3. Poziomy: czerń do 0, a biel do 1, dla każdej pozycji filtra kolorów, liczonej od rogu obszaru aktywnego.
  4. 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).
  5. Kolor: macierze aparatu, zmieszane dla światła ujęcia, w świetle liniowym.
  6. Tonacja i wygląd, dopasowane do podglądu z aparatu, z jego winietowaniem obiektywu.
  7. 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.

6 z 6chwil z wyraźnie najlepszym: akceptowalna podpowiedź
15 z 22chwil znalezionych, nigdy dwie pomylone
17 msna analizę zdjęcia, 28 ms z twarzami
Podpowiedzi najlepszych ujęć w porównaniu ze zdjęciami posortowanymi ręcznie
Podpowiedzi najlepszych ujęć w porównaniu ze zdjęciami posortowanymi ręcznie7

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

Przeczytaj RESULT.md na GitHubie Wróć na stronę główną

  1. 1. SIMD (single instruction, multiple data – jedna instrukcja, wiele danych) pozwala procesorowi pracować na wielu wartościach naraz: jedna instrukcja działa na kilku liczbach ułożonych obok siebie w szerokim rejestrze wektorowym, na przykład na czerwieni, zieleni i błękicie wielu pikseli. Procesory Intel i AMD zapewniają je jako SSE i AVX, a Apple silicon i inne procesory Arm jako NEON. Intel, AMD i Arm są znakami towarowymi ich właścicieli.
  2. 2. Jednostki: px to piksel, jeden punkt obrazu; MP (megapiksel) to milion pikseli, więc zdjęcie 20 MP ma około 5472 × 3648 px; ms to milisekunda, tysięczna część sekundy; MB i GB to megabajty i gigabajty; RAM (pamięć o dostępie swobodnym) to pamięć robocza komputera.
  3. 3. Rust i logo Rust są znakami towarowymi Rust Foundation. Rdzeń Fotollection jest napisany w Ruście i działa bezpośrednio na twoim komputerze.
  4. 4. EXIF (Exchangeable Image File Format) to standard, prowadzony przez japońskie JEITA i CIPA, dla informacji, które aparat zapisuje w każdym zdjęciu: aparat i obiektyw, data i godzina, ekspozycja, często pozycja GPS i mała osadzona miniatura.
  5. 5. Plik RAW zawiera to, co zarejestrowała matryca, zanim aparat zamienił to w obraz, więc o kolorze, jasności i szczegółach można zdecydować później, podobnie jak przy wywoływaniu negatywu. Każdy producent ma własny format (CR3 Canona, NEF Nikona, ARW Sony, RW2 Panasonica i inne); DNG (Digital Negative) to otwarty format RAW opublikowany przez Adobe.
  6. 6. JPEG to format obrazu Joint Photographic Experts Group, ustandaryzowany jako ISO/IEC 10918-1 i ITU-T T.81.
  7. 7. Każdy wykres: liczby są orientacyjne, zmierzone na zwykłym laptopie (Apple M3, 16 GB); twoje zależą od komputera, którego używasz.
  8. 8. Adobe, Lightroom i Lightroom Classic są znakami towarowymi Adobe Inc. w Stanach Zjednoczonych i innych krajach. Fotollection nie jest powiązane z Adobe ani przez nie wspierane; korzysta ze skrótów i układu, które znają użytkownicy Lightrooma. Logo Lightroom pochodzi z Wikimedia Commons, gdzie jako logo tekstowe jest w domenie publicznej.
  9. 9. Okno aplikacji jest zbudowane w Tauri i rysowane przez własny widok WWW systemu: WebKit (WKWebView) na macOS, Microsoft Edge WebView2 na Windows i WebKitGTK, czyli port WebKit dla GTK, na Linuksie. Tauri to projekt Tauri Programme w ramach Commons Conservancy; WebKit jest znakiem towarowym Apple Inc.; GTK to projekt GNOME Foundation; Microsoft Edge i WebView2 są znakami towarowymi Microsoft Corporation. Porównanie z przeglądarką wykonało to samo zadanie w Chromium 156 bez interfejsu (headless), projekcie open source, na którym opiera się Google Chrome, z jednym Web Workerem na rdzeń procesora.
  10. 10. Praski folder należy do autora i nie jest publikowany (© @hoangphi01, wszelkie prawa zastrzeżone). Mediany z 3 przebiegów bench/trip.sh oraz measure_folder na jego JPEG-ach, na Apple M3 z 16 GB, przy otwartych innych aplikacjach, 2026-11-04, z eksportem z v0.9.7; uruchom je na własnym folderze, by porównać.
  11. 11. p50 i p95 to percentyle: p50, czyli mediana, to czas, w którym zmieściła się połowa przebiegów; p95 to czas, w którym zmieściło się 95 przebiegów na 100, więc pokazuje wolne przypadki, które ukrywa średnia.
  12. 12. Adobe DNG Converter nie był uruchamiany na potrzeby tej strony. Ta liczba to szacunek z zewnętrznego źródła (1000 plików CR3 w 20–30 minut na nowoczesnym sprzęcie, bez podania maszyny), z wpisu na blogu convertintomp4.com o wsadowej konwersji RAW do DNG. Adobe jest zarejestrowanym znakiem towarowym Adobe Inc.
  13. 13. CMOS i CCD to dwa rodzaje matryc, czyli siatek światłoczułych komórek, które zamieniają światło w ładunek elektryczny. Prawie każdy dzisiejszy aparat i telefon używa CMOS (complementary metal-oxide-semiconductor); CCD (charge-coupled device) było powszechne we wcześniejszych aparatach.
  14. 14. PSNR (szczytowy stosunek sygnału do szumu, peak signal-to-noise ratio) porównuje dwa obrazy piksel po pikselu i podaje ich różnicę w decybelach: im wyżej, tym bliżej. Powyżej około 40 dB różnicę trudno zobaczyć.
  15. 15. TIFF (Tagged Image File Format) to elastyczny format obrazu, dziś utrzymywany przez Adobe; wiele formatów RAW, w tym DNG, opiera się na jego strukturze.
  16. 16. ΔE2000 (CIEDE2000) to wzór na różnicę barw Międzynarodowej Komisji Oświetleniowej (CIE), ustandaryzowany jako ISO/CIE 11664-6; przestrzeń barw CIELAB, w której działa, to ISO/CIE 11664-4.
  17. 17. SSIM wprowadzili Zhou Wang, Alan C. Bovik, Hamid R. Sheikh i Eero P. Simoncelli w pracy Image quality assessment: from error visibility to structural similarity, IEEE Transactions on Image Processing, 13(4), 2004.
  18. 18. HEIF (High Efficiency Image File Format) to format obrazu normy ISO/IEC 23008-12; HEIC to jego wariant kompresowany HEVC (H.265), w którym iPhone'y domyślnie zapisują zdjęcia. Zdjęcie HEIC jest mniej więcej o połowę mniejsze od JPEG-a o podobnej jakości.
  19. 19. sRGB stworzyły HP i Microsoft w 1996 roku, a ustandaryzowano je jako IEC 61966-2-1.
  20. 20. Display P3 to przestrzeń barw zdefiniowana przez Apple Inc., oparta na przestrzeni DCI-P3 branży kinowej (SMPTE).
  21. 21. Adobe RGB (1998) to przestrzeń barw określona przez Adobe Inc.; Adobe jest zarejestrowanym znakiem towarowym Adobe Inc.

Usługi fotograficzne w dm i Rossmannie prowadzi CEWE, znak towarowy CEWE Stiftung & Co. KGaA. Formaty odbitek sprawdzono z cennikiem dm w październiku 2026; sklepy mogą je zmienić.

Praskie zdjęcia na zrzutach ekranu (tramwaje, ulice, Wełtawa) zrobił @hoangphi01 aparatem Lumix GX9 w listopadzie 2026: © @hoangphi01, wszelkie prawa zastrzeżone. Nie obejmuje ich licencja aplikacji i nie wolno ich ponownie wykorzystywać. Pozostałe zdjęcia demonstracyjne są w domenie publicznej (CC0) na Wikimedia Commons, autorstwa Dktue (7 zdjęć), Pierre Blaché z Paryża, Francja (2) i Kate Branch (1). Kota na zrzutach koszyka do druku i najlepszego ujęcia także sfotografował @hoangphi01 aparatem GX9, wszelkie prawa zastrzeżone; łagodniejsze, poruszone i ciemniejsze kopie obok powstały z tego jednego zdjęcia, by pokazać, jak wybierane jest najlepsze ujęcie. Każdy plik, jego strona i suma kontrolna.

Pomiary RAW korzystają z dziewięciu próbek w domenie publicznej (CC0) z raw.pixls.us, po jednej na format; scripts/fetch-raw-samples.py je pobiera i sprawdza.

Formaty RAW wymienione na tej stronie należą do producentów aparatów, którzy je definiują: RW2 (Panasonic Holdings Corporation), CR2 i CR3 (Canon Inc.), NEF (Nikon Corporation), ARW (Sony Group Corporation), RAF (FUJIFILM Corporation) i ORF (OM Digital Solutions Corporation, dawniej Olympus). DNG to otwarta specyfikacja opublikowana przez Adobe Inc. Fotollection czyta je czytnikiem wbudowanym w Fotollection, a na macOS najpierw kodekami systemu (na Windows rozszerzenie Raw Image Extension Microsoftu jest ostatnim wyjściem, jeśli jest zainstalowane); żadna z tych firm go nie tworzy ani nie wspiera.

Nazwy i logo aparatów na zrzutach ekranu i w ramce z danymi w aplikacji są znakami towarowymi ich właścicieli, użytymi tylko po to, by pokazać, jakim aparatem zrobiono zdjęcie: Apple (Apple Inc.), Canon (Canon Inc.), Fujifilm (FUJIFILM Corporation), Hasselblad (Victor Hasselblad AB), Leica (Leica Camera AG), Lumix (Panasonic Holdings Corporation), Nikon (Nikon Corporation), Noritsu (Noritsu Koki Co., Ltd.), Phase One (Phase One A/S), Ricoh (Ricoh Company, Ltd.), Samsung (Samsung Electronics Co., Ltd.) i Sony (Sony Group Corporation).

Apple i macOS są znakami towarowymi Apple Inc.; Windows – Microsoft Corporation; Linux jest zarejestrowanym znakiem towarowym Linusa Torvaldsa w USA i innych krajach; Ubuntu – Canonical Ltd.; Debian – Software in the Public Interest, Inc.; Fedora, Red Hat, RHEL i CentOS – Red Hat, Inc.; openSUSE – SUSE LLC; Pop!_OS – System76, Inc.; Rocky Linux – Rocky Enterprise Software Foundation; AlmaLinux – AlmaLinux OS Foundation; ChromeOS – Google LLC; NVIDIA – NVIDIA Corporation; nazwy innych dystrybucji Linuksa należą do ich projektów; Facebook i Instagram – Meta Platforms, Inc.; GitHub – GitHub, Inc.; Google Analytics – Google LLC; Lightroom – Adobe Inc.; IrfanView – Irfan Škiljan; VietQR – NAPAS; Wikimedia Commons – Wikimedia Foundation. Znaki Apple, Windows i Linux (Tux, pierwotnie narysowany przez Larry'ego Ewinga) pochodzą z Simple Icons (CC0) i pokazują tylko, którego systemu dotyczy kolumna lub krok.

Fotollection to niezależny projekt open source. Nie jest powiązane z żadną z tych firm, sponsorowane ani wspierane przez nie, a każdy inny znak towarowy należy do swojego właściciela.

Nazwa i logo Fotollection oznaczają oficjalną aplikację, tworzoną przez @hoangphi01. Oficjalne pliki do pobrania pochodzą wyłącznie z fotollection.org i z wydań projektu na GitHubie. Licencja GPL-3.0 pozwala każdemu udostępniać lub sprzedawać kopie, zmienione czy nie, o ile zachowa tę licencję i udostępni kod źródłowy; zmieniona lub odsprzedawana kopia nie może używać nazwy ani logo Fotollection tak, by sugerować, że jest oficjalną aplikacją.

Udostępniasz lub sprzedajesz Fotollection albo budujesz na nim? Najpierw daj znać autorowi, zakładając zgłoszenie na GitHubie (github.com/hoangphi01/fotollection/issues). Aplikacja jest darmowa i powstaje w wolnym czasie; krótka wiadomość to uczciwy sposób, by podziękować.

Cytujesz, recenzujesz lub pokazujesz aplikację albo używasz tych zrzutów ekranu? Podaj Fotollection jako źródło i dodaj link do fotollection.org.