A SAMPLE PROGRAM DEMONSTRATING HOW TO READ A BITMAP FILE

/* Structures */
typedef struct
{
int rows; int cols; unsigned char* data;
} sImage;

/* Functions */
long getImageInfo(FILE*, long, int);

int main(int argc, char * argv[])
{

FILE *bmpInput;
char signature[2]; /* Signature of the Image File BM = BMP */
int nRows, nCols; /* Row and Column size of the Image */
int xpixpeRm, ypixpeRm; /* Pixel/m */
long nColors; /* BMP number of colors */
long fileSize; /* BMP file size */
long vectorSize; /* BMP's raster data in number of bytes */
int nBits; /* # of BIts per Pixel */
int rasterOffset; /* Beginning of the Raster Data */
int i;

if(argc<2)>
printf("Usage: %s bmpInput.bmp\n", argv[0]);
exit(0);
}
printf("Reading filename %s\n", argv[1]);

if ((bmpInput = fopen(argv[1], "rb")) == NULL)
{
printf("Can not read BMP file");
exit(0);
} /* Read BMP input file */

fseek(bmpInput, 0L, SEEK_SET); /* File pointer at byte #0 */

/* Signature of the File BM = BMP at byte # 0*/
for(i=0; i<2;>
{
signature[i] = (char)getImageInfo(bmpInput, i, 1);
}
if ((signature[0] == 'B') && (signature[1] == 'M')) printf("It is verified that the Image is in Bitmap format\n");
else
{
printf("The image is not a bitmap format, quitting....\n");
exit(0);
}

/* Read BMP bits/pixel at byte #28 */
nBits = (int)getImageInfo(bmpInput, 28, 2);
printf("The Image is \t%d-bit\n", nBits);

/* Position of First Raster Data at byte # 10*/
rasterOffset = (int)getImageInfo(bmpInput, 10, 4);
printf("The beginning of the Raster Data \nis at \t\t%d byte\n", rasterOffset);

/* Read BMP file size at byte # 2 */
fileSize = getImageInfo(bmpInput, 2, 4);
printf("File size is \t%ld byte\n", fileSize);

/* Read BMP width at byte #18 */
nCols = (int)getImageInfo(bmpInput, 18, 4);
printf("Width: \t\t%d\n", nCols);

/* Read BMP height at byte #22 */
nRows = (int)getImageInfo(bmpInput, 22, 4);
printf("Height: \t%d\n", nRows);

/* # of Pixels in a meter in x direction at byte # 38 */
xpixpeRm = (int)getImageInfo(bmpInput, 38, 4);
printf("Image has \t%d pixels per m in x-dir.\n", xpixpeRm);

/* # of Pixels in a meter in y direction at byte # 42 */
ypixpeRm = getImageInfo(bmpInput, 42, 4);
printf("Image has \t%d pixels per m in y-dir.\n", ypixpeRm);

/* Read number of colors at byte #46 */
nColors = pow(2L,nBits);
printf("There are \t%ld number of Colors \n", nColors);

vectorSize = (long)((long)nCols*(long)nRows);
printf("Vector Size is \t%ld\n", vectorSize);

fclose (bmpInput);

} /* end of main */


long getImageInfo(FILE* inputFile, long offset, int numberOfChars)
{

unsigned char *ptrC;
long value=0L;
unsigned char dummy;
int i;

dummy = '0'; ptrC = &dummy;

fseek(inputFile, offset, SEEK_SET);

for(i=1; i<=numberOfChars; i++)
{
fread(ptrC, sizeof(char), 1, inputFile);

value = (long)(value + (*ptrC)*(pow(256, (i-1))));
}

return(value);

} /* end of getImageInfo */

No comments:

Post a Comment