[ typedef @ 31.05.2006. 18:00 ] @
Pishem neki ispitni projekat u C-u koji treba da obradjuje Uncompressed 24b BMP slike. Otprilike funkcionishe ovako: BMP datoteku uchitavam u matricu i vrshim transformacije nad njom radi postizanja zeljene izmene nad slikom. I na kraju sve iz RAM-a snimim na HDD. Izmene su rotiranje, flip, darker, lighter, kontrast, blend, edge detection... trte-mrte...

PROBLEM:
BMP datoteka se sastoji iz FILE HEADERA, INFO HEADERA, PALETE i "SLIKE" - niza od B,G,R bajtova.

Prochitam fajl heder, info heder, paletu, dodjem do slike i eto problema! Konkretno, ucitam sliku 10x10 pixela u kojoj je svaki pixel crven (0, 0, 255). Pronadjem u info hederu da mi je slika 10x10, iterativno krenem da chitam pixele:


typedef unsigned char byte;

typedef struct {
byte b; /* PLAVA */
byte g; /* ZELENA */
byte r; /* CRVENA */
}PIXEL;

PIXEL pix;

***
fread(&pix, sizeof(pix), 1, slika);

***
printf("%4d,%4d,%4d ", pix.b, pix.g, pix.r);

Prochitam ja od 1 do 10 pixela kako treba u prvom redu (tachnije u poslednjem jer je u BMP datoteci slika naopachke) i dobijem prikaz:

0, 0, 255 0, 0, 255 0, 0, 255 0, 0, 255 ... 0, 0, 255

Zatim predjem na drugi red i pojave mi se dve nule!?!?!

0, 0, 255 0, 0, 255 0, 0, 255 0, 0, 255 ... 0, 0, 255
0 0

I onda opet 10 crvenih pixela iz sledeceg reda i tako sve... KAO DA IMA DVE KOLONE NULTIH PIXELA VISHKA A DA TO NIGDE NE MOGU DA NADJEM U DOKUMENTACIJI!!! Sve radi kako treba kad preskocim ta dva pixela sa:

fseek(f, 2 ,SEEK_CUR); -( 2 da preskochim ta dva vishka pixela!)

Probao sam i sa vecim i manjim slikama i svim zivim i uvek moram da preskocim 2 pixela za prelazak u novi red.

ZNA LI NEKO ZBOG CHEGA??!?!!!



[ NastyBoy @ 31.05.2006. 18:11 ] @
Wild guess, poshto se ne secam BMP formata:
- Pogledaj da nije problem u "alignment"-u. Tj. izgleda mi iz ove perspektive da su linije slike zaokruzhene na 4-bajtnu velichinu (10*3 + 2 vishka u tvom sluchaju daju 32 bajta)
[ typedef @ 31.05.2006. 18:38 ] @
Isto se deshava i sa 9x9, 141x329... :|
[ NastyBoy @ 31.05.2006. 19:49 ] @
Da, k'o shto rekoh :

Citat:
Another important thing is that the number of bytes in one row must always be adjusted to fit into the border of a multiple of four. You simply append zero bytes until the number of bytes in a row reaches a multiple of four, an example:

6 bytes that represent a row in the bitmap: A0 37 F2 8B 31 C4
must be saved as: A0 37 F2 8B 31 C4 00 00

[ typedef @ 01.06.2006. 00:01 ] @
Kontam o chemu govorish. Ali mi nije jasno zashto meni i sa 9 bajta on doda 2. To mu dodje u prevodu da je 11 (ukupna duzina sa dodatim null bajtovima) deljiva sa 4. :\ Zar onda ne bi trebao da doda 3 bajta?! Ili ja ovde neshto ne kontam kako treba. :|

Hvala ti na saradnji! :)
[ NastyBoy @ 01.06.2006. 02:27 ] @
Neshto si ti tu prekalkulisao. Prvo proveri BITMAPINFOHEADER.biBitCount da proverish koliko bitova imash po pikselu.

Link sa sorsom za chitanje bmp-a :
http://astronomy.swin.edu.au/~pbourke/dataformats/bmp/
[ typedef @ 01.06.2006. 16:46 ] @
:D Uspeh da izvedem kako treba! :) Fala na pomoci!