#include "read_bmp.h"
int Load_BMP(const char *file_name, BMP_Data *bmp_data)
{
struct BMP_File_Header bmp_file_header;
struct BMP_Image_Header bmp_image_header;
FILE *bmp_file;
if( !(bmp_file = fopen(file_name, "rb")) )
return 0;
fread( &bmp_file_header, sizeof bmp_file_header, 1, bmp_file);
fread( &bmp_image_header, sizeof bmp_image_header, 1, bmp_file);
if( *((char *)&bmp_file_header.type) != 'B' &&
*(((char *)&bmp_file_header.type)+1) != 'M' &&
bmp_image_header.depth != 24 )
{
fclose( bmp_file );
return 0;
}
bmp_data->width = bmp_image_header.width;
bmp_data->height = bmp_image_header.height;
bmp_data->data = (char *)malloc( bmp_image_header.size );
fseek( bmp_file, bmp_file_header.l_data_offset, SEEK_SET);
fread( bmp_data->data, bmp_image_header.size, 1, bmp_file);
fclose( bmp_file );
return 1;
}
int Save_BMP(const char *file_name, const BMP_Data *bmp_data)
{
struct BMP_File_Header bmp_file_header;
struct BMP_Image_Header bmp_image_header;
FILE *bmp_file;
if( !(bmp_file = fopen(file_name, "rb")) )
return 0;
fread( &bmp_file_header, sizeof bmp_file_header, 1, bmp_file);
fread( &bmp_image_header, sizeof bmp_image_header, 1, bmp_file);
if( *((char *)&bmp_file_header.type) != 'B' ||
*(((char *)&bmp_file_header.type)+1) != 'M' ||
bmp_image_header.depth != 24 ||
bmp_data->width != bmp_image_header.width ||
bmp_data->height != bmp_image_header.height )
{
fclose( bmp_file );
return 0;
}
fclose( bmp_file );
if( !(bmp_file = fopen(file_name, "wb")) )
return 0;
fwrite( &bmp_file_header, sizeof bmp_file_header, 1, bmp_file);
fwrite( &bmp_image_header, sizeof bmp_image_header, 1, bmp_file);
fwrite( bmp_data->data, bmp_data->width * bmp_data->height * 3, 1, bmp_file);
fclose(bmp_file);
return 1;
}
评论0