Nowe posty

Autor Wątek: Zapisywanie obrazu do BMP pliku - memcpy naruszenie pamięci  (Przeczytany 3120 razy)

  • Gość
Aktualnie próbuje napisać funkcję zapisującą ze standardowego formatu obrazu (macierz nxm z kolorami) do pliku BMP. Wysupuje się mnie na memcpy w forze (spisywanie scan lines). Nie wiem dlaczego, sprawdzałem te miejsce.

Kod funkcji

Cytuj
int SaveBMP (int **imageTable, BITMAP *imageBMPheaders, char *filename){
char *data = NULL;
int i = 0, result = 0;
int data_length = 0;
// file header - 14, info header - 40 , pallete 0,
imageBMPheaders->biSize = 40;
data_length = 14 + imageBMPheaders->biSize + 0 + imageBMPheaders->biWidth*imageBMPheaders->biHeight*4;
data = (char *)malloc(sizeof(char)*data_length);
if (data == NULL) return -1;
memcpy (imageBMPheaders->bfType, "BM", 2);
imageBMPheaders->bfSize = data_length;
imageBMPheaders->bfReserved1 = 0;
imageBMPheaders->bfReserved2 = 0;
imageBMPheaders->bfOffBits = 14 + imageBMPheaders->biSize + 0;
imageBMPheaders->biPlanes = 1;
imageBMPheaders->biBitCount = 24;
imageBMPheaders->biCompression = 0;
imageBMPheaders->biSizeImage = imageBMPheaders->biWidth*imageBMPheaders->biHeight*4;

memcpy (data, imageBMPheaders, 14+imageBMPheaders->biSize);

for (i = imageBMPheaders->biHeight-1; i>=0; i--)
    memcpy (data+imageBMPheaders->bfOffBits+(i-1)*imageBMPheaders->biWidth*4, imageTable, imageBMPheaders->biWidth);

FILE *fileBMP= fopen (filename, "wb");

if (fileBMP == NULL) return -1;

result = fwrite (data, 1, data_length, fileBMP);

if (result == -1) return -1;

fclose (fileBMP);

free (data);

}
Ktoś wie co robie źle?

darkdancer

  • Gość
Zapisywanie obrazu do BMP pliku - memcpy naruszenie pamięci
« Odpowiedź #1 dnia: 2010-11-07, 16:17:36 »
Cytat: Xgrzyb90
memcpy (data+imageBMPheaders->bfOffBits+(i-1)*imageBMPheaders->biWidth*4, imageTable, imageBMPheaders->biWidth);
Nie chce mi się w to wnikać ale tak na zdrowy rozum jak masz pętlę to dla ostatniej iteracji gdzie i=0 masz (0-1)*cośtamcoś, czyli cofasz się przed to twoje bfOffBits czymkolwiek by to nie było. Całość najpewniej wędruje sobie poza pamięć którą wcześniej rezerwujesz i możesz zaobserwować jakiś ładny segfault.