Bitmapa 8-bitowa – określenie dokładnej liczby kolorów w palecie

0

W specyfikacji jest napisane ze 8 bitowe BMP zawiera co najwyzej 256 kolorow w tablicy kolorow do ktorej wskazoja poszczegolne pixele. Moje pytanie dotyczy skąd mozna okreslic dokladna ilosc tych kolorow. Chce uzywac malloca do wczytywania do tablicy , wiec potrzebuje wiedziec dokladnie.

0

Jesteś pewien, że "co najmniej"? Jak może być więcej kolorów niż 256 zapisanych na 8 bitach?

0

Co najwyzej. Moj blad.

0
dandon223 napisał(a):

Co najwyzej. Moj blad.

No to alokuj miejsce na 256 kolorów i już.

0

Ale potem uzywam wskazniku do pliku zeby zczytywac poszczegolne bajty do struktor i jak za duzo zczytam do tej tablicy to wskaznik bedzie za daleko i wczyta tez poszczegolne pixele a tego przeciez nie chce.

0

No, ale to gdzieś musi być napisane w nagłówku, albo w DIB, nie? Poczytaj dobrze:
https://en.wikipedia.org/wiki/BMP_file_format

0

Prawdopodobnie znalazlem ale jest to nie jasno napisane i powinni poprawic. Ale ok. A wiesz moze czy te kolory w color table sa jakos posegregowane. Chcialbym naprzyklad uzyc filtru medianowego. To czy wystarczy obliczyc ta mediane dla tablicy wskaznikow do poszczegolnych kolorow, czy trzeba po kolei dla R G i B i potem znalezc odpowiadajacy kolor w tej tablicy?

0

Przecież tam na wiki jest wyraźnie w jednej z tabelek:

the number of colors in the color palette, or 0 to default to 2n

0

Ok. A jak to bedzie dla 16 bitowej i z filterm medianowym? Tez musze na RGB rozdzielic i dopiero w tedy zastosowac ten filtr?
Jakich operacji musze sie nauczyc aby na przyklad z jednego bajta skopiowac 5 pierwszych bitow i zrobic z tego innego bajta?

0
dandon223 napisał(a):

Jakich operacji musze sie nauczyc aby na przyklad z jednego bajta skopiowac 5 pierwszych bitow i zrobic z tego innego bajta?

Bitowych. W szczególności, pierwszych pięć bitów bajta to:

output = (input & 0xF8) >> 3 /* 0xF8 == 0b1111_1000, ale C nie ma literałów binarnych */
0

Jak jest 16 bitowa to ktore bity to sa wartosci R , G i B? Znalazlem 2 zrodla ktore twierdza inaczej.

void grey_16(struct InfoHeader *pointer2,struct data*pointer3,struct data*pointer4)
{
    int padding = what_padding(pointer2,2);
    int a = pointer2->width;
    int b = pointer2->height;
    for(int j=0;j<b;j++) 
    {
        for(int i = j*(a*2 +padding) ; i< j*(a*2+padding)+(a*2+padding)-padding ;i= i +2) 
        {
            unsigned char tab[2];
            tab[0] = pointer3->pixel_data[i];
            tab[1] = pointer3->pixel_data[i+1];
            int R = tab[0]>>3;
            int G = ((tab[0] & 0x7)<<2) | (tab[1]>>6);
            int B = ((tab[1]>>1) & 0x1F);
            int A = (tab[1]&0x1);
            int average = (R + G+ B)/3;
          //  printf("%i, %i, %i,%i, %i\n",R,G,B,A,average);
            R = average;
            G = average;
            B = average;
            tab[0]=(R<<3)|(G>>2);
            tab[1]=(G<<6)|(B<<1)|A;
         //   printf("%i, %i, %i, %i , %i\n",R,G,B,tab[0],tab[1]);
            pointer4->pixel_data[i] = tab[0];
            pointer4->pixel_data[i+1] = tab[1];
        }
   }
}

Bo takie cos mi nie dziala.

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