#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