// quick and dirty bitmap loader...for 24 bit bitmaps with 1 plane only. // See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/BMP.txt for more info. #include #include #include #include "loadbmp.h" int ImageLoad(char *filename, Image *image) { FILE *file; size_t size; // size of the image in bytes. size_t i; // standard counter. int32_t sizeX, sizeY; // width/height of the image - must be 4 bytes to match the file format int16_t planes; // number of planes in image (must be 1) int16_t bpp; // number of bits per pixel (must be 24) char temp; // temporary color storage for bgr-rgb conversion. // make sure the file is there. if ((file = fopen(filename, "rb"))==NULL) { printf("File Not Found : %s\n",filename); return 0; } // seek through the bmp header, up to the width/height: fseek(file, 18, SEEK_CUR); // read the width if ((i = fread(&sizeX, 4, 1, file)) != 1) { printf("Error reading width from %s.\n", filename); return 0; } image->sizeX = sizeX; printf("Width of %s: %d\n", filename, sizeX); // read the height if ((i = fread(&sizeY, 4, 1, file)) != 1) { printf("Error reading height from %s.\n", filename); return 0; } image->sizeY = sizeY; printf("Height of %s: %d\n", filename, sizeY); // calculate the size (assuming 24 bits or 3 bytes per pixel). size = image->sizeX * image->sizeY * 3; // read the planes if ((fread(&planes, 2, 1, file)) != 1) { printf("Error reading planes from %s.\n", filename); return 0; } if (planes != 1) { printf("Planes from %s is not 1: %u\n", filename, planes); return 0; } // read the bpp if ((i = fread(&bpp, 2, 1, file)) != 1) { printf("Error reading bpp from %s.\n", filename); return 0; } if (bpp != 24) { printf("Bpp from %s is not 24: %u\n", filename, bpp); return 0; } // seek past the rest of the bitmap header. fseek(file, 24, SEEK_CUR); // read the data. image->data = (char *) malloc(size); if (image->data == NULL) { printf("Error allocating memory for color-corrected image data"); return 0; } if ((i = fread(image->data, size, 1, file)) != 1) { printf("Error reading image data from %s.\n", filename); return 0; } for (i=0;i rgb) temp = image->data[i]; image->data[i] = image->data[i+2]; image->data[i+2] = temp; } // we're done. return 1; }