2010-08-24:

Jak nie ukrywać swojej twarzy

jpeg:easy
Dostałem dzisiaj od znajomego pewne zdjęcie, w formacie JPEG. Zdjęcie przedstawiało osobę, której twarz została zamalowana czarnym prostokątem. Nie było by w tym nic ciekawego, gdyby nie to, że explorer pokazywał na miniaturce twarz niezamalowaną :)

Z przyczyn oczywistych nie będę publikował otrzymanego zdjęcia, a posłużę się innym, o podobnych "parametrach".

OK, mamy więc takie oto zdjęcie:
przykładowe zdjęcie z zamalowaną twarzą

Jak widać, posiadacz fotografii, zapewne osoba na zdjęciu, postanowił ukryć swoją twarz (z losowych przyczyn).

Gdybyśmy jednak na to zdjęcie popatrzyli (RMB, Save as...) np. z explorera, to naszym oczom ukaże się wersja z niezasłoniętą twarzą:

explorer


Dlaczego tak się dzieje? Jaki błąd popełniła osoba publikująca to zdjęcie?

Całość związana jest z metadanymi EXIF, które mogą, ale nie muszą, być obecne w pliku JPG. Mianowicie, standard EXIF przewiduje możliwość umieszczenia miniaturki obrazka w metadanych - całkiem przydatna opcja, szczególnie jeśli obrazek ma bardzo duże rozmiary. W omawianym przypadku taka miniaturka została wygenerowana, i umieszczona wśród innych metadanych, prawdopodobnie przez aparat fotograficzny.

Następnie, zainteresowana osoba wczytała zdjęcie w jakimś programie graficznym, zamalowała twarz, a następnie zapisała zdjęcie. I tu właśnie jest pies pogrzebany - nie wszystkie programy radzą sobie dobrze z nagłówkami EXIF. Dlaczego? Może dlatego, że najnowszy standard EXIF ma aż 182 strony. A może po prostu program miał założenie, że jeśli jakieś metadane EXIF już istnieją, to są ważniejsze od tego co on mógłby wygenerować, więc ich nie zmieniał. Niezależnie jednak od przyczyny, program postanowił skopiować istniejące nagłówki EXIF razem ze starą miniaturką (z odsłoniętą twarzą).

Niestety, mało kto sprawdza, przed publikacją zdjęć, nagłówki EXIF, więc zdjęcie z odsłoniętą twarzą w miniaturce poszło w świat.
Miniaturka może być całkiem niemała


Jak wymusić regenerację miniaturek, lub usunąć cały EXIF?
Do regeneracji miniaturek osobiście używam konsolowego programu jhead (wymaga pakietu ImageMagick do regeneracji).
Natomiast do usuwania EXIF wystarczy np. IrfanView (przy zapisie obrazka jako JPEG odznaczamy "Keep original EXIF data").
Oczywiście metod jest więcej i przypuszczam, że sporo programów graficznych pozwala zdecydować co do EXIFów ma ostatecznie trafić :)

W każdym razie, problemy z prywatnością EXIF miewał już w przeszłości. Zachęcam do rzucenia okiem na dwie sprawy (co ciekawe, obie dotyczyły "rozbieranych" zdjęć):

* TechTV's Cat Schwartz Exposed: Is Photoshop To Blame? - W skrócie: prezenterka TV umieściła na blogu fragment swojego zdjęcia z wakacji. Jak się jednak okazało, EXIFowa miniaturka została wygenerowana z całego zdjęcia (a nie tylko opublikowanego wyciętego fragmentu), na którym niestety owa pani nie była całkowicie ubrana.

* EXIF, iPhone, GPS ...i nagie fotki - W skrócie: pewna dziewczyna opublikowała odważne zdjęcie zrobione iPhonem. Ku jej zaskoczeniu, iPhone załączył w metadanych koordynaty GPS z miejsca zrobienia zdjęcia, czyli de facto miejsca jej zamieszkania.

Problem niepożądanych metadanych nie ogranicza się jedynie do EXIF. Osoby zainteresowane zachęcam do rzucenia okiem np. tutaj.

I tyle ;)

UPDATE:
P.S. Skoro już jestem przy tym temacie, to opiszę jeszcze jedną historię z życia wziętą :)
Kilka lat temu pewien znajomy podesłał mi zdjęcie (również JPEG, o enigmatycznej (hash/uid) nazwie 36bdf1ed00011b8e.jpg) pewnej czarnowłosej dziewczyny, które otrzymał od pewnej osoby na czacie, jako zdjęcie tej własnie osoby. Z jakiegoś powodu zdjęcie wzbudziło wątpliwości mojego znajomego, więc w rezultacie dostałem je do "sprawdzenia czy jest prawdziwe".
Zagadka okazała się dużo prostsza niż się spodziewałem, a do jej rozwiązania przyczynił się, tym razem nie EXIF, a metadane IPTC (drugi rodzaj metadanych które są używane w JPEG), a konkretniej Adobe XMP oraz pole:
crs:RawFileName="7477135.jpg"
Po wrzuceniu powyższej nazwy pliku w google - 7477135.jpg, czyli de facto nazwy pierwotnej, moim oczom ukazał się oryginał, przedstawiający lustrzane odbicie tego samego zdjęcia, z tym że modelka (było to zdjęcie z galerii pewnej modelki) miała blond włosy, a nie czarne.

Jak widać znajomy miał nosa, a dowcipnisia z czatu wydały metadane :)

Comments:

2010-08-24 01:26:08 = Jurgi
{
Starsze nieco programy generalnie mają problemy z EXIF. I nie tylko stare. Np. Paint Shop Pro 8 przy zapisie zawsze usuwa cały EXIF. Popularny (i dobry) FastStone Image Viewer cały zachowuje i też nie ma się na to wpływu.
W rezultacie do czyszczenia metadanych używam osobnego programu: EXIF Cleaner. Upierdliwe to, niestety.
}
2010-08-24 10:14:25 = Nikow
{
jhead ma chyba przełącznik -purejpg, który wywala wszystkie dodatkowe śmieci i zostawia czystego JPG'a. Więc można go używać nie tylko do regeneracji metadanych, ale do wywalania również.
}
2010-08-24 10:23:39 = el
{
Panie gyn, popatrzyli, nie popatrzeli :) Wyrazy uznania
}
2010-08-24 20:35:17 = Karton
{
Wychodzi na to, że facet zrobi wszytko, włącznie z tworzeniem standardu mającego 182 strony tylko po to żeby zobaczyć nagie fotki :)
}
2010-08-24 23:32:02 = anonim
{
mnie zastanawia, po co w ogole w jpgu jest mozliwosc dolaczenia w metadanych miniaturki zdjecia, przeciez to nie kompresuje zdjecia (ale odkrycie :) ), a tylko zwieksza jego rozmiar, co wiecej to jest informacja nadmiarowa, miniaturke mozna wygenerowac z obrazka wiekszego. wiec po co? (do glowy przyszla mi mozliwosc uzywania metadanych z naglowka w celu przyspieszenia przegladania duzej ilosci obrazow, np zdjec, po miniaturkach, ale imho to sie mija troche z celem - te paredziesiat milisekund generowania miniaturki nikomu nie zrobi chyba zadnej roznicy)
}
2010-08-25 02:05:50 = ged_
{
@
"te paredziesiat milisekund generowania miniaturki nikomu nie zrobi chyba zadnej roznicy)"

a robi ci roznice te pare bajtow wiecej? :).
moze np. w aparatach cyfrowych generowanie miniaturek za kazdym razem jest zbyt kosztowne?
}
2010-08-25 10:41:48 = anonim
{
@ged
majac zbior paru tysiecy zdjec, to raczej tak, tym bardziej ze skoro to jest miniaturka, to nie jest pare bajtow wiecej, to jest po prostu obraz w obrazku.
co do aparatow - fakt, celna uwaga, nie pomyslalem o tym, chociaz nie sadze, by to bylo krytyczne - i tak najwiecej energii pobiera sam wyswietlacz.
samo to ze mozna wstawiac miniaturki do zdjec nie jest zle, zle jest to ze tak malo programow graficznych w ogole informuje o czyms takim jak wyzej wymieniona miniaturka (nie sadze by kazda osoba pykajaca zdjecia amatorsko znala naglowki EXIF na blache wspak i po rumunsku, baa, mysle ze tylko nieliczne osoby wiedzialy o tej mozliwosci jpgow ;] ).
}
2010-08-25 11:07:00 = Gynvael Coldwind
{
@Jurgi
Hmm, w sumie możnaby zrobić listę oprogramowania (razem z wersjami) i informacją o tym jak reaguje na EXIFa i co supportuje. W zasadzie można by też dołączyć informacje o strukturze EXIFa, strukturze samego generowanego pliku, wrzucić to w jakiś program i otrzymujemy program-do-sprawdzania-jakim-programem-został-wygenerowany-dany-obrazek :)

@Nikow
Yep, zgadza się :)

@el
Poprawione, thx :)

@Kraton
:D

@anonim
Bardzo trafna uwaga :)

Z optymalizacją to jest tak, że wybrać trzeba maksymalnie dwie spośród trzech cech:
- wielkości pliku (a raczej jego "małości")
- szybkości działania
- zużycia pamięci
Zauważ, że JPEG nam nic nie narzuca - metadane EXIF są opcjonalne, a w zasadzie nawet nie są częścią standardu JPEG (np. w TIFF też EXIF się używa, po za tym zamiast/razem z EXIF można użyć metadanych w formacie IPTC), więc tak naprawdę osoba publikująca może zdecydować czy chce:
a) mały plik, ale bez miniaturki (więc szybkość działania spadnie, ze względu na generowanie miniaturki) - przydatne przy wrzucaniu fotek do netu
b) szybkie przeglądanie (więc thumbnail trzeba załączyć w pliku) - korzystne np. w przypadku opisanym przez ged_'a

Co do "paredziesiąt milisekund", to raczej zależy od metody, tj. czy jest to resize czy resampling, jakiego algorytmu używa, etc. Może się zdarzyć, że będzie to i pareset milisekund, co przy dużej kolekcji obrazków daje sporo czasu straconego na generowanie miniaturek.
Dlatego file managery cache'ują te miniaturki, np. w plikach thumbs.db (explorer) (który to zresztą czasem można na pentestach znaleźć w katalogach typu /image /img, etc; ot takie kolejne metadane do analizy ;>)

Zgadzam się, że przydałoby się trochę więcej tzw. świadomości społecznej jeśli chodzi o metadane :)
}
2010-08-25 14:04:34 = Nikow
{
Pytanie tylko po co przeciętnemu kowalskiemu wiedza o metadanych? To raczej informacja dla informatykow, bo to oni powinni wiedzieć jak to działa i dlaczego. A Ci co będą zainteresowani budową jpg napewno się o metadanych dowiedzą.
Gdyby wiele osób wiedziało o EXIF praca policji byłaby trudniejszą..

BTW: Android sux
}
2010-08-25 18:16:22 = Agares
{
@Nikow:
Czytałeś w ogóle cały ten post? Lepiej będzie temu przeciętnemu Kowalskiemu, jak nie będzie widać tego co chciał ukryć. Rozwiń, co masz na myśli, jeśli chodzi o pracę policji vs. EXIF.

BTW: Android rox
}
2010-08-26 00:11:57 = ged_
{
@anonim:
"kosztowne" w sensie czasu procesora, mozliwe ze takie generowanie w locie zamuliloby urzadzenie.
}
2010-08-26 00:34:53 = anonim
{
@ged
bo ja wiem, moim zdaniem dodawanie miniaturek w zdjeciach to zly pomysl, uzytkownikowi raczej zalezy na tym, by na karcie pamieci zmiescilo sie jak najwiecej zdjec, zreszta mysle ze lepszym rozwiazaniem byloby ladowanie zdjecia "partiami" (jak na stronach internetowych sie czesto spotyka) - najpierw zdjecie jest niewyrazne, pozniej dostaje coraz to wiecej szczegolow - w tym to jest lepsze od miniaturki, ze jest zawsze aktualizowane po zmianie zdjecia (ewentualnie w ogole kasowane, bo inaczej takie rozwiazanie straciloby sens - nie trzeba chyba mowic czemu), niby taka "partyjna" kompresja tez swoje zajmuje, ale miniaturka ma podstawowa wade w porownaniu do tej kompresji - jak uzytkownik chce powiekszyc sobie zdjecie w aparacie, to aparat musi ladowac druga wersje (wieksza) zdjecia - w takim wypadku okazuje sie, ze miniaturka byla ladowana niepotrzebnie - w wersji z wyzej wymieniona kompresja bardziej niewyrazny obraz jest wstepem do ladowania szczegolow - co przyspiesza ladowanie duzej wersji zdjecia
}
2010-08-26 01:18:27 = Gynvael Coldwind
{
@Nikow
Nie żyjemy w państwie policyjnym i każdy ma prawo do prywatności. I własnie o prywatność chodzi - w interesie każdego użytkownika który publikuje zdjęcia jest "wiedzenie" o tym, że metadane istnieją, co mogą zawierać, jak to sprawdzić, a już na pewno jak to usunąć.

Ad androidowy - to czy android "sux" czy "niesux" jest zupełnie niezwiązane z tematem tego postu, więc prosiłbym nie wywoływać flamewar'ów :)

@anonim
Moim zdaniem dobrze, że JPG generowanych przez aparaty są miniaturki. Jak ged słusznie zauważył, w innym przypadku aparaty fotograficzne nie byłyby zbyt szybki. Poza tym karta pamięci ma zazwyczaj ograniczoną liczbę cykli zapisów i odczytów (aka żywotność), więc "piłowanie" jej odczytywaniem każdego obrazka w pełnej wersji, żeby zrobić miniaturkę, jest raczej niepożądane.

Co do ładowania progresywnego które sugerujesz - pomysł jest dobry, ale ma jedną dużą wadę...
Od miniaturek oczekuje się, że będą w miarę wierne, dlatego przy generowaniu miniaturki robiony jest resampling, który w najprostszej wersji wygląda tak:
"Dla każdego pixela miniaturki policz średni kolor ze wszystkich pixeli które przypadają na ten sam region obrazka w pełnej wersji"
Czyli np. jeśli oryginał ma 640x640, a resample robiony jest do 64x64, to dla każdego pixela miniatury liczona jest średnia koloru z kwadratu 10x10.
Oczywiście lepsze metody resample'u nie liczą średniej, a biorą pod uwagę różne zależności między kolorami.
Natomiast ładowanie progresywne które proponujesz działa jak zwykły resize, czyli de facto gdybyśmy chcieli załadować obrazek tylko i wyłącznie do rozmiarów 64x64 (z oryginału 640x640), to 99 z każdej setki pixeli zostanie pominięte, co zazwyczaj powoduje niesamowitą wręcz utratę jakości.

Przykładowo, porównajmy następujące obrazki:

* Oryginał 128x128 - przedstawia pionowe linie
http://gynvael.vexillium.org/ext/lines.png

* Resample do 64x64 - nadal pionowe linie, może odrobinę mniej intensywne
http://gynvael.vexillium.org/ext/lines_resample.png

* Resize do 64x64 - pusty biały obrazek, bo pixele zawierające ważne informacje (linie) zostały pominięte
http://gynvael.vexillium.org/ext/lines_resize.png

Gdyby miniaturki opierały się o ładowanie progresywne, to efekt byłby identyczny jak na ostatnim obrazku - bardzo dużo informacji by ginęło.

W związku z czym moim zdaniem dołączanie miniaturek do obrazków to "fair trade" który wychodzi na plus. A co do oszczędzania miejsca w aparacie, to nie przesadzajmy. Na karcie wielkości 4GB wejdzie kilkaset - kilka tysięcy obrazków, a taką ilość naprawdę jest trudno "wypstrykać"

Poza tym, dużo więcej aparat wyświetla miniaturek, niż pełnych zdjęć :)
}
2010-08-26 09:01:03 = Nikow
{
W czasie pisania komentarza na tej stronie Android się niemiłosiernie tnie.
Przeciętnemu kowalskiemu wiedza o ukrywaniu czegokolwiek jest niepotrzebna, bo jego jpg są adresowane do osob o równie przeciętnej wiedzy.
Policji wielokrotnie udało się namierzyć pedofila dzięki geotagom lub miniaturkom, których program nie zmienił w trakcie zamalowywania twarzy. Fakt ten nie dotyczy tylko pedofilow, słyszałem raz porywaczach, ktorzy wpadli przez geotagi, bo zrobili zdjęcie ofiary nie wyłączając znaczenia zdjęć przez komórkę
}
2010-08-26 09:22:22 = Kele
{
@topic
Dobrze, że miniaturki są generowane i zapisywane w JPGach przez cyfrówki. Kwestia wydajności ma według mnie w tym przypadku o wiele wyższy priorytet niż prywatność. Zresztą, w tym przypadku winowajcą ewidentnie jest jakiś program graficzny.

Podczas pisania komentarza wpadłem na jeszcze jeden pomysł. Serwisy typu imageshack powinny oferować 'feature' pozwalający na usuwanie metadanych. Właściwie, mieć go włączony defaultowo. Jeżeli komuś zależy na tym, żeby metadane zostały zachowane, to najczęściej 'wie o co chodzi', więc włączyłby tę opcję.

@Nikow
Ten argument z policją równie dobrze można by zastosować, jeśli rząd/ktokolwiek chciałby w każdym domu zamontować kamerę monitorującą mieszkańców. Też ułatwiłoby im pracę, a przecież to tylko jest ważne :)
}
2010-08-27 18:08:40 = timiss
{
To ciekawostka, widać wiele mnie jeszcze zaskoczy. W życiu nie domyśliłbym się, że takie coś jest w ogóle możliwe. Dla mnie to zamalowany obrazek i tyle, nie ma opcji, żeby owe zamalowanie ściągnąć a tu proszę niespodzianka :)
}
2010-08-27 19:31:14 = Filip Zieliński
{
Heh, ciekawy post, chyba zacznę się bardziej przyglądać zdjęciom, które publikuje w Internecie... Kto wie, co opublikowałem, a nie powinno ujrzeć światła dziennego?...
}
2010-08-28 13:32:44 = ged_
{
@anonim:
"majac zbior paru tysiecy zdjec, to raczej tak, tym bardziej ze skoro to jest miniaturka, to nie jest pare bajtow wiecej, to jest po prostu obraz w obrazku."

rownie dobrze mozna powiedziec, ze generowanie miniaturek w locie dla paru tysiecy zdjec bedzie czasochlonne.

czasami dobrze zeby miniaturka byla, a czasami zeby jej nie bylo, ale IMO nie mozna powiedziec, ze powinna zostac usunieta ze standardu jpega.
}
2010-08-29 13:27:05 = Fanael
{
ged_, musisz przyznać, że ciężko usunąć coś, co nie istnieje (JPEG nic o miniaturkach nie wie, to ficzer EXIFa), prawda...? ;>
}
2010-08-29 16:09:44 = ged_
{
@fanael:
zgadza sie, moj blad.
}
2010-08-30 15:07:45 = anonim
{
@Fanael
zwykla gra slowek - skoro JPEG nic o miniaturkach nie wie, to rownie dobrze moze nie wiedziec nic o EXIFie. Jesli juz jest dodana mozliwosc dodania metadanych do zdjecia, to powinna ona zostac przemyslana - np przerabiane zdjecie powinno zostac pozbawione w ogole metadanych (w najgorszym przypadku), ewentualnie uzytkownik w co lepszych programach graficznych powinien byc uswiadomiony co do ich istnienia. Tak naprawde to nie wina JPEGa, a programow graficznych, ale szczerze mowiac, malo ktorego uzytkownika obchodzi czyja to wina, to ma po prostu chronic jego prywatnosc. Owszem, w wielu przypadkach metadane pomagaja np policji, ale to raczej efekt uboczny nieswiadomosci uzytkownika, rownie dobrze mozna ich uzyc w zlym celu. Tak wiec apeluje do wszystkich - przerzucmy sie na BMP ;>
}
2010-08-31 09:38:16 = MSM
{
Mój uniwersalny sposób na pozbycie się "tych wrednych metadanych" - wyświetlenie obrazka, zrobienie screena, wklejenie do notatnika i zapisanie. Zero metadanych :). Sposób może niegodny programisty, ale za to prosty, szybki i nie wymaga żadnego oprogramowania.
}
2010-08-31 11:37:53 = anonim
{
w przypadku duzych obrazkow wygodniej zapisac do BMP, a nastepnie otworzyc BMP i zapisac jako JPG ;>
}
2010-09-02 09:55:56 = Xer
{
Sprawdzał ktoś jakie edytory grafiki domyślnie pozostawiają niezmienioną miniaturkę?
}
2010-09-07 00:15:20 = anonim
{
Paint .NET na pewno (chyba że coś się zmieniło w najnowszej wersji), podejrzewam że większość programów, które nie pozwalają na jawną edycję nagłówków, pozostawiają je niezmienione (zgodnie z zasadą - nie tykaj gówna to nie będzie Ci śmierdziało :) ). Szczerze mówiąc, wątpię, że komukolwiek chciało się to sprawdzać, bo jeśli ktoś wie o nagłówkach, to po prostu sobie sprawdził, czy jego sprzęt (czyt. aparat fotograficzny lub komórka) nie dopisuje niechcianych informacji do pliku i w razie wystąpienia owych wyłączył ten ficzer. Zresztą jest pełno programów kasujących nagłówki, np. ten z tej stronki -> http://www.rlvision.com/exif/about.asp (jeden z wyników wyszukiwania w Google frazy "exif remover").
}
2010-09-09 09:46:41 = xkif
{
Hymm, no muszę przyznać bardzo to ciekawe - zacznę pilnować od teraz nagłówków zanim coś opublikuję :)

off:
gyn, nie wiem czy w tym siedzisz, ale może napisałbyś kiedyś coś o keygenach/keygenningu, jak to właściwie działa czy coś w tym stylu? Temat wydaje mi się ciekawy, a nie jest zbyt często opisywany.
}
2011-03-09 10:55:54 = d1554573r
{
mipmap fail :P
}

Add a comment:

Nick:
URL (optional):
Math captcha: 10 ∗ 5 + 1 =