Tak jak w temacie, kompiluje sie idealnie, crashuje przy odpaleniu.
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int main()
{
const int x = 16;
const int y = 16;
FILE *fp = fopen("nowy.bmp", "wb");
// INFORMACJE W NAGLOWKU SA ZAPISANE 2 LUB 4 BAJTAMI DANYCH
// UNSIGNED SHORT INT JEST ODPOWIEDNIK DLA TYPU WORD - 2 BAJTY
// UNSIGNED LONG INT JEST ODPOWIEDNIK DLA TYPU DWORD - 4 BAJTY
// Nagłowek pliku
unsigned short int bfType;
unsigned long int bfSize;
unsigned short int bfReserved1;
unsigned short int bfReserved2;
unsigned long int bfOffBits;
// Nagłowek bitmapy
unsigned long int biSize;
unsigned long int biWidth;
unsigned long int biHeight;
unsigned short int biPlanes;
unsigned short int biBitCount;
unsigned long int biCompression;
unsigned long int biSizeImage;
unsigned long int biXPelsPerMeter;
unsigned long int biYPelsPerMeter;
unsigned long int biClrUsed;
unsigned long int biClrImportant;
unsigned char b = 'B', m = 'M';
bfType = (b) | (m); // Musi być BM - czyli bitmapa
bfSize = 54+((x*y)*3); // Określenie długości pliku w bajtach
bfReserved1 = 0; // Zarezerwowane - 0
bfReserved2 = 0; // Zarezerwowane - 0
bfOffBits = 54; // Położenie obszaru danych względem początku pliku - czyli gdzie zaczyna się obraz właściwy
biSize = 40; // Długość nagłówka obrazu (40)
biWidth = x; // Szerokość obrazka
biHeight = y; // Wysokość obrazka
biPlanes = 1; // Liczba planów w urządzeniu docelowym, zawsze równa 1
biBitCount = 24; // Pole określa ile kolejnych bitów z obszaru danych opisuje kolor jednego punktu rysunku. Jednocześnie informuje ono, ile maksymalnie kolorów zawiera paleta kolorów. Pole to może przyjmować kilka wartości:
// 1 obrazek jest dwubarwny, paleta kolorów zawiera opis maksymalnie dwóch barw, każdy bit obszaru danych określa kolor jednego punktu rysunku,
// 4 obrazek może mieć maksimum 16 kolorów i taka jest maksymalna liczba barw w palecie kolorów, każde cztery bity obszaru danych określają barwę jednego punktu,
// 8 obrazek może mieć maksimum 256 kolorów, paleta zawiera opis maksimum 256 barw, każdy punkt rysunku opisywany jest przez 8 bitów,
// 24 rysunek może mieć maksimum 224 = 16.777.216 kolorów (True Color), w tym przypadku nie ma palety kolorów tylko każde trzy bajty obszaru danych określają odpowiednio natężenie koloru czerwonego, zielonego i niebieskiego
// 32 rysunek może mieć maksimum 224 = 16.777.216 kolorów (True Color), w tym przypadku nie ma palety kolorów tylko każde cztery bajty obszaru danych określają odpowiednio natężenie koloru czerwonego, zielonego i niebieskiego zaś ostatni bajt może służyć do przechowywania składowej A (Alpha), bądź nie jest wykorzystany
biCompression = 0; // Pole określa sposób kompresji obszaru danych pliku i może przyjmować jedną z trzech wartości:
// 0 brak kodowania,
// 1 kodowanie RLE8 (Run Length Encoding 8-Bits),
// 2 kodowanie RLE4 (Run Length Encoding 4-Bits).
biSizeImage = (x*y)*3; // Długość obszaru danych w bajtach
biXPelsPerMeter = 0; // Rozdzielczość pozioma obrazka w punktach na metr
biYPelsPerMeter = 0; // Rozdzielczość pionowa obrazka w punktach na metr
biClrUsed = 0; // Pole określa ile kolorów z palety jest wykorzystywanych w rysunku, wartość zero oznacza, że wykorzystywana jest cała paleta, w trybie True Color (24-bitowym) zmienna ta określa wielkość tabeli kolorów, która wystarcza, aby program wczytujący rysunek mógł pomieścić użyte w rysunku kolory
biClrImportant = 0; // Pole określa ile kolorów wystarcza, aby możliwie poprawnie wyświetlić rysunek, zaleca się aby kolory w palecie były uszeregowane według malejącego znaczenia w rysunku, zero oznacza, że cała paleta jest istotna
fwrite((char*)&bfType, 1, sizeof(bfType), fp);
fwrite((char*)&bfSize, 1, sizeof(bfSize), fp);
fwrite((char*)&bfReserved1, 1, sizeof(bfReserved1), fp);
fwrite((char*)&bfReserved2, 1, sizeof(bfReserved2), fp);
fwrite((char*)&bfOffBits, 1, sizeof(bfOffBits), fp);
fwrite((char*)&biSize, 1, sizeof(biSize), fp);
fwrite((char*)&biWidth, 1, sizeof(biWidth), fp);
fwrite((char*)&biHeight, 1, sizeof(biHeight), fp);
fwrite((char*)&biPlanes, 1, sizeof(biPlanes), fp);
fwrite((char*)&biBitCount, 1, sizeof(biBitCount), fp);
fwrite((char*)&biCompression, 1, sizeof(biCompression), fp);
fwrite((char*)&biSizeImage, 1, sizeof(biSizeImage), fp);
fwrite((char*)&biXPelsPerMeter, 1, sizeof(biXPelsPerMeter), fp);
fwrite((char*)&biYPelsPerMeter, 1, sizeof(biYPelsPerMeter), fp);
fwrite((char*)&biClrUsed, 1, sizeof(biClrUsed), fp);
fwrite((char*)&biClrImportant, 1, sizeof(biClrImportant), fp);
static unsigned char R; // Czerwony
static unsigned char G; // Zielony
static unsigned char B; // Niebieski
for (int yy = 0; yy < y; yy++)
{
for (int xx = 0; xx < x; xx++)
{
R = 255;
G = 255;
B = 255;
fwrite((char*)R, 1, sizeof(R), fp);
fwrite((char*)G, 1, sizeof(G), fp);
fwrite((char*)B, 1, sizeof(B), fp);
}
}
fclose(fp);
cout << endl;
cout << "mozna wylaczyc";
getch();
}
PS Kompilator Code::Blocks