Próbuję zrobić bitmapę w C, właśnie z kodu. Obecnie próbuję utworzyć bardzo prosty obraz .bmp o wysokości 1 piksela i szerokości 4 pikseli ze wszystkimi białymi pikselami. Przeczytałem opis formatu i próbowałem go zastosować. W rezultacie powstał następujący kod:Tworzenie pliku BMP (mapa bitowa) w C
char bitmap[1000];
void BMPmake()
{
// -- FILE HEADER -- //
// bitmap signature
bitmap[0] = 'B';
bitmap[1] = 'M';
// file size
bitmap[2] = 66; // 40 + 14 + 12
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;
// reserved field (in hex. 00 00 00 00)
for(int i = 6; i < 10; i++) bitmap[i] = 0;
// offset of pixel data inside the image
for(int i = 10; i < 14; i++) bitmap[i] = 0;
// -- BITMAP HEADER -- //
// header size
bitmap[14] = 40;
for(int i = 15; i < 18; i++) bitmap[i] = 0;
// width of the image
bitmap[18] = 4;
for(int i = 19; i < 22; i++) bitmap[i] = 0;
// height of the image
bitmap[22] = 1;
for(int i = 23; i < 26; i++) bitmap[i] = 0;
// reserved field
bitmap[26] = 1;
bitmap[27] = 0;
// number of bits per pixel
bitmap[28] = 24; // 3 byte
bitmap[29] = 0;
// compression method (no compression here)
for(int i = 30; i < 34; i++) bitmap[i] = 0;
// size of pixel data
bitmap[34] = 12; // 12 bits => 4 pixels
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;
// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0b00110000;
bitmap[41] = 0b10110001;
// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0b00110000;
bitmap[45] = 0b10110001;
// color pallette information
for(int i = 46; i < 50; i++) bitmap[i] = 0;
// number of important colors
for(int i = 50; i < 54; i++) bitmap[i] = 0;
// -- PIXEL DATA -- //
for(int i = 54; i < 66; i++) bitmap[i] = 0;
}
void BMPwrite()
{
FILE *file;
file = fopen("bitmap.bmp", "w+");
for(int i = 0; i < 66; i++)
{
fputc(bitmap[i], file);
}
fclose(file);
}
Kiedy próbuję otworzyć ten obraz, mówi on, że obraz jest uszkodzony. Czy coś mi umyka?
Zauważyłem również, że kodowanie liczb całkowitych .bmp jest małe endian. Myślałem, że to oznacza, że muszę odwrócić kolejność bajtów. Na przykład 256 w czterech bajtach to: 00000000 00000000 00000001 00000000, i myślę, że w małym endianie to będzie: 00000000 00000001 00000000 00000000
Czy ktoś może mi tu podać pomocną dłoń? Czy używam właściwego podejścia? Każda pomoc będzie doceniona!
Z góry dziękuję!
Narysuj obraz, który chciałbyś wygenerować za pomocą ulubionego edytora graficznego, a następnie spróbuj skopiować jego bajt po bajcie. – dasblinkenlight
Masz błąd endianizmu w polach rozdzielczości. Twoja praca będzie znacznie łatwiejsza, jeśli napiszesz funkcje pomocnicze, aby pobrać 2-bajtowe i 4-bajtowe liczby całkowite i spakować je do swojej tablicy bajtów. –
dasblinkenlight, próbowałem to zrobić w Pixelmator (na Macu), ale dostałem plik bmp o wielkości 84 bajtów, podczas gdy oczekuję, że będzie to 66 bajtów, może spróbuję otworzyć go programem, który pokazuje mi bajt na bajt;) – Devos50