#include <stdio.h>
#include <stdlib.h>
#include <string.h>


unsigned char file_type[2];
unsigned long file_size;
unsigned long data_offset;
unsigned char temp[4];
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPixPerMeter;
unsigned long biYPixPerMeter;
unsigned long biClrUsed;
unsigned long biCirImportant;





void read_file_header( FILE *fp )
{
/*
    unsigned char file_type[2];
    unsigned long file_size;
    unsigned long data_offset;;
    unsigned char temp[4];
*/

    /* file type */
    if( (fread( file_type, sizeof(char), 2, fp )) < 2 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* file size */
    if( (fread( &file_size, sizeof(long), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* skip reserve */
    if( (fread( temp, sizeof(char), 4, fp )) < 4 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	
    
    /* data offset */
    if( (fread( &data_offset, sizeof(long), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* file type check */
    if( memcmp( file_type, "BM", 2 ) != 0 ){
	fprintf(stderr, "file isn't BMP file¥n");
	return;
    }
    
    /* print */
    printf("file type=%c%c¥n", file_type[0], file_type[1] );
    printf("file size=%ld¥n", file_size );
    printf("data offset=%ld¥n", data_offset );

}

void read_bmpinfo_header( FILE *fp )
{
/*
    unsigned long biSize;
    unsigned long biWidth;
    unsigned long biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long biCompression;
    unsigned long biSizeImage;
    unsigned long biXPixPerMeter;
    unsigned long biYPixPerMeter;
    unsigned long biClrUsed;
    unsigned long biCirImportant;
*/


    /* biSize */
    if( (fread( &biSize, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biWidth */
    if( (fread( &biWidth, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biHeight */
    if( (fread( &biHeight, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biPlanes */
    if( (fread( &biPlanes, sizeof(short), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biBitCount */
    if( (fread( &biBitCount, sizeof(short), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biCompression */
    if( (fread( &biCompression, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biSizeImage */
    if( (fread( &biSizeImage, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biXPixPerMeter */
    if( (fread( &biXPixPerMeter, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biYPixPerMeter */
    if( (fread( &biYPixPerMeter, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biClrUsed */
    if( (fread( &biClrUsed, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    /* biCirImportant */
    if( (fread( &biCirImportant, sizeof(int), 1, fp )) < 1 ){
	fprintf(stderr, "file read error¥n");
	return;
    }	

    
    /* print */
    printf("biSize=%ld¥n",	    biSize	    );
    printf("biWidth=%ld¥n",	    biWidth	    );
    printf("biHeight=%ld¥n",	    biHeight	    ); 
    printf("biPlanes=%d¥n",	    biPlanes	    );
    printf("biBitCount=%d¥n",	    biBitCount	    );
    printf("biCompression=%ld¥n",   biCompression   );
    printf("biSizeImage=%ld¥n",	    biSizeImage	    );
    printf("biXPixPerMeter=%ld¥n",  biXPixPerMeter  );
    printf("biYPixPerMeter=%ld¥n",  biYPixPerMeter  );
    printf("biClrUsed=%ld¥n",       biClrUsed	    );
    printf("biCirImportant=%ld¥n",  biCirImportant  );

}


void read_data( FILE *fp )
{
    unsigned int i,j;
    unsigned int line;
    unsigned int pos;
    
    // TODO
    unsigned char buf[512];

    line = ( biWidth * biBitCount ) / 8;
    if( (line % 4) != 0 ){
	line = ((line/4) + 1) * 4;
    }
    printf("line=%d¥n", line);

    for(i=0; i< biHeight; i++){
	pos = data_offset + line * (biHeight-(i+1));
	fseek( fp, pos, SEEK_SET);
	fread( buf, line, 1, fp );


	for(j=0; j<line; j++){
	    if( (j % 3) == 0 ) printf(",");
	    printf("%x ", buf[j]);
	}
	printf("¥n");


    }	





}




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

    FILE *fp;
    unsigned char temp[20];

    if( argc < 2 ){
	fprintf(stderr,"input filename¥n");
	exit(1);
    }

    if( (fp = fopen(argv[1], "rb") ) == NULL ){
	fprintf(stderr, "file open error¥nn");
	exit(1);
    }

    // read file header
    read_file_header( fp );
    
    // read bitmapinfo header
    read_bmpinfo_header( fp );

    // read data
    read_data( fp );
    







    // close
    fclose( fp );


    return 0;
}
最終更新:2010年05月25日 20:57