Witam,
mam tablicę wypełnioną zerami i jedynkami, np.: int tab[szer][wys] i muszę ją przerobić na plik .bmp
sposób nieistotny, mogę używać funkcji bibliotecznych
ma być łatwo i prosto
napisałam coś, tworzy plik, w hexedytorze widzę, że zapełnia danymi, ale windy twierdzą, że plik jest uszkodzony
pomocy!!! mam już mało czasu a nie mam pojęcia co robię źle :(
void bmp (int tab [][SZEROKOSC_OBRAZKA], int wys)
{
char bfType[2] = {'B', 'M'}; // Dwa bajty zawierające znaki 'BM' oznaczające, że jest to plik BMP.
unsigned int bfSize = 54 + (3 * SZEROKOSC_OBRAZKA * wys); // Całkowity rozmiar pliku wyrażony w bajtach.
unsigned short bfReserved1 = 0; // Zarezerwowane, wymagana wartość zero.
unsigned short bfReserved2 = 0; // Zarezerwowane, wymagana wartość zero.
unsigned int bfOffBits = 54; // Przesunięcie (wyrażone w bajtach) danych obrazu (mapy bitowej) od rekordu BITMAPFILEHEADER
unsigned int biSize = 40; // Rozmiar rekordu BITMAPINFOHEADER wyrażony w bajtach (powinien być zawsze 40).
unsigned int biWidth = SZEROKOSC_OBRAZKA; // Szerokość obrazu w pikselach
unsigned int biHeight = wys; // Wysokość obrazu w pikselach
unsigned short biPlanes = 1; // Przyjmuje zawsze wartość 1.
unsigned short biBitCount = 24; // Liczba bitów na piksel (1, 4, 8, 24)
unsigned int biCompression = 0; // Typ kompresji obrazu: BI_RGB - brak kompresji
unsigned int biSizeImage = 3 * SZEROKOSC_OBRAZKA * wys; // Rozmiar mapy bitowej obrazu wyrażony w bajtach. Może być ustawiony na zero, jeśli typem kompresji jest BI_RGB.
unsigned int biXPelsPerMeter = 0;// Rozdzielczość pozioma obrazu wyrażona w pikselach na metr - można zignorować (ustawić na 0)
unsigned int biYPelsPerMeter = 0;// Rozdzielczość pionowa obrazu wyrażona w pikselach na metr - można zignorować (ustawić na 0)
unsigned int biClrUsed = 0; // Liczba elementów tablicy kolorów. Wartość zero oznacza maksymalną dopuszczalną liczbę kolorów.
unsigned int biClrImportant = 0; // Liczba indeksów (kolorów) w tablicy kolorów, które są wymagane do poprawnego wyświetlenia obrazu. Wartość zero oznacza, że wszystkie kolory są wymagane.
FILE *plik;
if (( plik = fopen ("frak.bmp", "wb")) == NULL)
{
cout << "Blad otwarcia pliku do zapisu\n";
return;
}
else
cout << "\n\nOtworzylem plik do zapisu\n";
//zapis naglowkow do pliku
fwrite(bfType, 1, sizeof(bfType), plik);
fwrite(reinterpret_cast<char*>(&bfSize), 1, sizeof(bfSize), plik);
fwrite(reinterpret_cast<char*>(&bfReserved1), 1, sizeof(bfReserved1), plik);
fwrite(reinterpret_cast<char*>(&bfReserved2), 1, sizeof(bfReserved2), plik);
fwrite(reinterpret_cast<char*>(&bfOffBits), 1, sizeof(bfOffBits), plik);
fwrite(reinterpret_cast<char*>(&biSize), 1, sizeof(biSize), plik);
fwrite(reinterpret_cast<char*>(&biWidth), 1, sizeof(biWidth), plik);
fwrite(reinterpret_cast<char*>(&biHeight), 1, sizeof(biHeight), plik);
fwrite(reinterpret_cast<char*>(&biPlanes), 1, sizeof(biPlanes), plik);
fwrite(reinterpret_cast<char*>(&biBitCount), 1, sizeof(biBitCount), plik);
fwrite(reinterpret_cast<char*>(&biCompression), 1, sizeof(biCompression), plik);
fwrite(reinterpret_cast<char*>(&biSizeImage), 1, sizeof(biSizeImage), plik);
fwrite(reinterpret_cast<char*>(&biXPelsPerMeter), 1, sizeof(biXPelsPerMeter), plik);
fwrite(reinterpret_cast<char*>(&biYPelsPerMeter), 1, sizeof(biYPelsPerMeter), plik);
fwrite(reinterpret_cast<char*>(&biClrUsed), 1, sizeof(biClrUsed), plik);
fwrite(reinterpret_cast<char*>(&biClrImportant), 1, sizeof(biClrImportant), plik);
// Wskaznik typu unsigned int ktory bedzie wykorzystany jako dynamiczna tablica 3-elementowa
// do przechowywania wartości koloru piksela
unsigned int *kolor_pix = new unsigned int[3];
for (int i = 0; i < SZEROKOSC_OBRAZKA; i++)
{
for (int j = 0; j < SZEROKOSC_OBRAZKA; j++)
{
if (tab[j][i] == 1)
{
for (int k = 0; k < 3; k++)
kolor_pix[k] = 255;
}
else
{
for (int k = 0; k < 3; k++)
kolor_pix[k] = 0;
}
//zapis kolejnych pikseli
fwrite(reinterpret_cast<char*>(kolor_pix), 1, 3, plik);
}
// putchar ('\n');
}
if( fclose( plik ) )
cout << "Plik 'frak.bmp' nie zostal zamkniety\n" ;
}
wys
opisałem :>. Pierwsze błędy najpierw, na razie niech to produkuje poprawne bitmapy.