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.
Jesteś pewien, że "co najmniej"? Jak może być więcej kolorów niż 256 zapisanych na 8 bitach?
Co najwyzej. Moj blad.
dandon223 napisał(a):
Co najwyzej. Moj blad.
No to alokuj miejsce na 256 kolorów i już.
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.
No, ale to gdzieś musi być napisane w nagłówku, albo w DIB, nie? Poczytaj dobrze:
https://en.wikipedia.org/wiki/BMP_file_format
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?
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
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?
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 */
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.