Źle generowana bitmapa na podstawie niektórych wartości

0

Czy ktoś jest wstanie wyjaśnić dlaczego poniższy kod generuje poprawną bitmapę dla wartości np. x = 4, y = 4. A dla wartości x = 10, y = 10 jest już źle zapisana bitmapa???

    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;

    bfh.bfType          = 0x4D42;
    bfh.bfSize          = sizeof(bfh) + sizeof(bih) + 3 * x * y;
    bfh.bfReserved1     = 0;
    bfh.bfReserved2     = 0;
    bfh.bfOffBits       = sizeof(bfh) + sizeof(bih);

    bih.biSize          = sizeof(bih);
    bih.biWidth         = x;
    bih.biHeight        = y;
    bih.biPlanes        = 1;
    bih.biBitCount      = 24;
    bih.biCompression   = BI_RGB;
    bih.biSizeImage     = 0;
    bih.biXPelsPerMeter = 7874;
    bih.biYPelsPerMeter = 7874;
    bih.biClrUsed       = 0;
    bih.biClrImportant  = 0;
  
    fwrite(&bfh, 1, sizeof(bfh), f);
    fwrite(&bih, 1, sizeof(bih), f);

   //zapis bajt po bajcie do pliku f
3

Zapisujesz tylkosizeof(bfh) + sizeof(bih) bajtów, czyli sam nagłówek (może kilka bajtów więcej).

0

dlaczego sam? Potem mam przecież

fwrite(&bih, 1, sizeof(bih), f);
  • kod zapisywania rgb kolorów, którego już nie wklejałem.
2

Poprawiłem. Prawdopodobnie w kodzie zapisującym dane masz błąd.

1

Do obsługi plików graficznych polecam bibliotekę WIC.
https://msdn.microsoft.com/en-us/library/windows/desktop/ee720035%28v=vs.85%29.aspx

Na dzień dobry masz obsługę formatów JPG, PNG, TIFF, BMP i nie trzeba się babrać w nagłówku pliku.

WIC jest częścią Windowsa, nie trzeba nic instalować.

0

@Azarien
Niestety nie mogę użyć niczego innego ;d

@kq

for (int y = sizeY.u-1; y >= 0; y--)
    {
        for (int x = 0; x < sizeX.u; x++)
        {
            fputc((unsigned char)(210), f);
            fputc((unsigned char)(2), f);
            fputc((unsigned char)(2), f);
        }
    }

Tutaj raczej jest wszystko dobrze...

Ale dalej nie rozumiem dlaczego dla x = 10, y = 10 ciągle wyświetla mi się: "błąd pliku". A jak uruchomię dla wartości x = 20, y = 20, wówczas zapisze mi poprawną bitmapę.

1

Nie wiem na ile Ci to pomoże ale to :bih.biSizeImage = 0; jest chyba nie tak.

0

Według dokumentacji: "This may be set to zero for BI_RGB bitmaps."

Problem polegał na tym, że szerokość bitmapy musi być wielokrotnością 4 ;d

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