Zapis tablicy dynamicznej do *.bmp - problem.

0

Witam.

Mam problem z zapisem tablicy dynamicznej do bitmapy. Plik jest tworzony, ale nieprawidłowo wypełniany. Wygląda to tak, jakby się coś "rozjeżdżało".
Oto kod:

//......
class Color
{
public:
    int b, g, r;
//......
Color **pixels;
//......
void saveToBMP(char* fileName)
    {       
        unsigned char *BGR = new unsigned char[w*h*3];

        for (int i=0; i<h; i++)
        {
            for (int j=0; j<w; j++)
            {
                BGR[i*w+j*3] = (unsigned char)pixels[i][j].b;
                BGR[i*w+j*3+1] = (unsigned char)pixels[i][j].g;
                BGR[i*w+j*3+2] = (unsigned char)pixels[i][j].r;
            }
        }       

        short padding = 0x0000;
        short BM = 0x4d42;

        HEADER.size_of_file =  sizeof(HEADER) + sizeof(BGR) + sizeof(padding) * h + 2;
        HEADER.reserve = 0000; 
        HEADER.offset_of_pixle_data = 54;
        HEADER.size_of_header = 40;
        HEADER.width = w;
        HEADER.hight = h;
        HEADER.num_of_colour_plane = 1;
        HEADER.num_of_bit_per_pix = 24;
        HEADER.compression = 0;
        HEADER.size_of_pix_data = sizeof(BGR) + sizeof(padding) * h;
        HEADER.h_resolution = 2835;
        HEADER.v_resolution = 2835;
        HEADER.num_of_colour_in_palette = 0;
        HEADER.important_colours = 0;

        // write BMP Header ////////////////////////////////////////////////////////////////
        std::ofstream file;
        file.open (fileName, std::ios::out | std::ios::trunc | std::ios::binary);
        file.write ((char*)(&BM), 2);
        file.write ((char*)(&HEADER), sizeof(HEADER));

        for (int i=h-1; i>=0; --i)      
        {
            for (int j=0; j<w; j++)
            {               
                for (int k=0; k<3; ++k)
                {
                    file.write((char*)&BGR[i*w+j*3+k],sizeof(char));                    

                }

            }file.write ((char*)(&padding), 2);             
        }       
        file.close();
        delete[] BGR;
    }

A tu wywołanie:


Color c(255, 0, 0);
Color c1(255,255,255);

for(int i=0; i<cam.h; i++)
    {
        for(int j=0; j<cam.w; j++)
        {           
            if (i%2==0) cam.pixels[i][j] = c1;
            else cam.pixels[i][j] = c;
        }       
    }
    cam.saveToBMP("1.bmp"); 

W załączniku zamieszczam wynikowy obrazek.
Będę bardzo wdzięczny jeśli ktoś wytknie mi błąd :/. Siedziałem już nad tym długo i nie wiem co jest nie tak.
Z góry dziękuję.

0

A jaki obrazek był na początku, tzn.przed wykonaniem kodu ?

Mam problem z zapisem tablicy dynamicznej do bitmapy.

A po co zapisywać tablicę dynamiczną do bitmapy ?
Bitmapa, to jest tak właściwie taka tablica.

0

A jaki obrazek był na początku, tzn.przed wykonaniem kodu ?

W kodzie tworzę obrazek, nie modyfikuję już istniejącego. Po wykonaniu kodu ma być wypełniony liniami poziomymi na przemian niebieskie i białe.

A po co zapisywać tablicę dynamiczną do bitmapy ?
Bitmapa, to jest tak właściwie taka tablica.

Program ma właśnie za zadanie wygenerować bitmapę :).
Będę wdzięczny za pomoc.

0

Nie sprawdzałem za bardzo, ale czy szerokość jest podzielna przez 4 bez reszty? Jeśli nie, to musisz taką ustawić i na taki rozmiar zaalokować tablice na dane i te dodatkowe bajty muszą się = 0.


Aaaa.. tu:

 BGR[i*w+j*3].. // żle
 BGR[i*w*3+j*3] // dobrze i w kolejnych linijkach tak samo
0

Dzięki wielkie -=mAkAbrAs=-!! Teraz działa :D.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0