Przeglądarka zdjęć w C

0

Witam
Na wstępie chcę zaznaczyć że przejrzałem forum i nie znalazłem potrzebnych mi informacji, dlatego tworzę ten wątek.
Chciałbym napisać prostą przeglądarkę zdjęć w języku C. Nie musi ona przeglądać np. wszystkich zdjęć z danego katalogu, a jedynie wyświetlić plik oraz informacje - histogram dla poszczególnych kanałów RGB oraz luminancji względnej.

Jakich bibliotek/funkcji/kompilatora użyć do wykonania takiego projektu? Szczególnie potrzebuję pomocy przy uzyskiwaniu histogramu oraz luminancji zdjęcia.

0
  1. Określ jakie formaty graficzne chcesz wspierać i wybierz biblioteki, np jpg => libjpeg. Możesz też samemu zakodować odczyt obrazka
  2. Na tym etapie obrazki będziesz miał w formacie tablicy bajtów, łatwej do analizowania, stworzenie histogramu w takim przypadku to chwila pracy. Co do luminancji to nie za bardzo wiem co dokładnie chcesz osiągnąć. Chyba że masz na myśli określenie czy zdjęcie zostało prześwietlone/niedoświetlone (ale to automatycznie wynika z histogramu)
0
xxx_xx_x napisał(a):

określenie czy zdjęcie zostało prześwietlone/niedoświetlone (ale to automatycznie wynika z histogramu)

Przepraszam, że dopytam, bo nie wiem co masz na myśli - w jaki sposób to wynika z histogramu?

0

To nie do końca jest tak, o prześwietleniu czy niedoświetleniu można mówić, gdy wiadomo na 100%, że w prawo czy w lewo coś jeszcze było na scenie (czyli było coś ciemniejszego czy jaśniejszego). Taka informacja jest tylko w przypadku RAWów, a dla innych formatów plików nie da się stuprocentowo określić czy zdjęcie było prześwietlone, czy też nie.

0

Powielasz info z linku który zamieściłem, świetnie sobie zdaję z tego sprawę że histogram nie daje 100% pewności, jednak w większości przypadków pozwala określić potencjalnie prześwietlone/niedoświetlone zdjęcie.

0
xxx_xx_x napisał(a):

Powielasz info z linku który zamieściłem, świetnie sobie zdaję z tego sprawę że histogram nie daje 100% pewności, jednak w większości przypadków pozwala określić potencjalnie prześwietlone/niedoświetlone zdjęcie.

Nie czytałem całości, spojrzałem, może i powielam. Jeśli jednak świetnie zdajesz sobie sprawę, że histogram nie daje 100% pewności, to pewnie też wiesz, że to, co napisałeś wcześniej - "określenie czy zdjęcie zostało prześwietlone/niedoświetlone (ale to automatycznie wynika z histogramu)" - nie jest w 100% prawdziwe ;-)

Dobra, już nie czepiam się szczegółów :)

0

Przeglądarka zdjęć. Odczyt kilku formatów plików. Wyświetlanie histogramu dla poszczególnych kanałów RGB oraz luminancji względnej. - to jest temat pracy. A więc libjpeg, libmp itp, ok.
Nadal niestety nie bardzo rozumiem jak zabrać się do histogramu oraz luminancji, jak je wykonać?

1

Każda bibioteka działa nieco inaczej, ale zasada jest mniej więcej taka że dostaniesz tablicę bajtów (zwykle jednowymiarową) która będzie zawierać kolejne linie poziome, przykładowo obrazek 3x2 pixele
a1 a2 a3
b1 b2 b3
będzie przedstawiony w tablicy jednowymiarowej: [ a1, a2, a3, b1, b2, b3]
Od obrazka zależy ile bajtów przypada na jeden piksel, np obrazek z paletą 16 bitów będzie miał 2 bajty na piksel. Musisz wiedzieć w jakim formacie dostałeś bitmapę od biblioteki, jeżeli jest to np RGB_565 to wiesz że jeden pixel ba dwa bajty( 5 + 6 + 5 = 16 bitów = 2bajty). więc żeby odczytać kolor robisz coś takiego:

int color = bitmap[ (x + y * scanlineX) * 2 + 0] + (bitmap[ (x + y * scanlineX) * 2 + 1] << 8)   // little endian
unsigned char  r =  ((color>>11) & 0x1F) << 3;
unsigned char  g =  ((color>>5) & 0x3F) << 2;
unsigned char  b =  ((color) & 0x1F) << 2;

x,y współrzędne piksela, scanlineX = ResX + uzupełnienie linii

histogramy dla składowych R G B :

unsigned long rHist[256] = { 0 };
unsigned long gHist[256] = { 0 };
unsigned long bHist[256] = { 0 };

i teraz w pętli dekodującej kolor:

 rHist[r]++;
 gHist[g]++;
 bHist[b]++;

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