Gdy spróbowałem odczytać bitmapę, przekonwertować ją do macierzy i spowrotem zapisać ją do BMP, to przy sprawdzeniu pliku zauważyłem, że cały obraz wyjściowy jest czarny. Sprawdziłem wszystkie wartości w macierzy obrazu były 0. Co zrobiłem, źle?
int **imageBMPtoStandard (BITMAP *imageBMP){
int i = 0;
int *imageBMPdata = NULL, **imageBMPtable = NULL;
imageBMPdata = imageBMP + imageBMP->bfOffBits;
imageBMPtable = CreateStandard(imageBMP->biWidth, imageBMP->biHeight);
for (i = 0; ibiSize; i++)
imageBMPtable[imageBMP->biHeight-i/imageBMP->biWidth-1][i%imageBMP->biWidth] = imageBMPdata;
return imageBMPtable;
}
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*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);
}
typedef struct tagBITMAP {
char bfType[2];
int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
int bfOffBits;
int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
int biCompression;
int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
int biClrUsed;
char biClrImportant;
char biClrRotation;
unsigned short biReserved;
} BITMAP;