📄 imageio.c
字号:
******************************************/
read_bm_header(file_name,
bmheader)
char *file_name;
struct bitmapheader *bmheader;
{
char buffer[10];
long ll;
short ss;
unsigned long ull;
unsigned short uss;
FILE *fp;
fp = fopen(file_name, "rb");
/****************************************
*
* Seek past the first 14 byte header.
*
****************************************/
fseek(fp, 14, SEEK_SET);
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->size = ull;
fread(buffer, 1, 4, fp);
extract_long_from_buffer(buffer, 1, 0, &ll);
bmheader->width = ll;
fread(buffer, 1, 4, fp);
extract_long_from_buffer(buffer, 1, 0, &ll);
bmheader->height = ll;
fread(buffer, 1, 2, fp);
extract_ushort_from_buffer(buffer, 1, 0, &uss);
bmheader->planes = uss;
fread(buffer, 1, 2, fp);
extract_ushort_from_buffer(buffer, 1, 0, &uss);
bmheader->bitsperpixel = uss;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->compression = ull;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->sizeofbitmap = ull;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->horzres = ull;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->vertres = ull;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->colorsused = ull;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
bmheader->colorsimp = ull;
fclose(fp);
} /* ends read_bm_header */
/******************************************
*
* print_bm_header(...
*
* This function printfs parts of the
* bitmapheader structure.
*
******************************************/
print_bm_header(bmheader)
struct bitmapheader *bmheader;
{
printf("\nwidth %d", bmheader->width);
printf("\nheight %d", bmheader->height);
printf("\nplanes %d", bmheader->planes);
printf("\nbitsperpixel %d", bmheader->bitsperpixel);
printf("\ncolorsused %d", bmheader->colorsused);
printf("\ncolorsimp %d", bmheader->colorsimp);
}
/******************************************
*
* read_color_table(...
*
* This function reads the color table
* from a bmp image file.
*
******************************************/
read_color_table(file_name, rgb, size)
char *file_name;
struct ctstruct *rgb;
int size;
{
int i;
char buffer[10];
FILE *fp;
fp = fopen(file_name, "rb");
fseek(fp, 54, SEEK_SET);
for(i=0; i<size; i++){
fread(buffer, 1, 1, fp);
rgb[i].blue = buffer[0];
fread(buffer, 1, 1, fp);
rgb[i].green = buffer[0];
fread(buffer, 1, 1, fp);
rgb[i].red = buffer[0];
fread(buffer, 1, 1, fp);
/* fourth byte nothing */
} /* ends loop over i */
fclose(fp);
} /* ends read_color_table */
/******************************************
*
* print_color_table(...
*
* This function printfs the color table
* from a bmp file.
*
******************************************/
print_color_table(struct ctstruct *rgb, int size)
{
int i;
for(i=0; i<size; i++){
printf("\n %d %d %d",
rgb[i].blue,rgb[i].green,rgb[i].red);
} /* ends loop over i */
} /* ends print_color_table */
/******************************************
*
* flip_image_array(...
*
* This function flips an image array
* about its horizontal mid-point.
*
******************************************/
flip_image_array(the_image, rows, cols)
long cols, rows;
short **the_image;
{
int i, j;
long rd2;
short **temp;
temp = allocate_image_array(rows, cols);
rd2 = rows/2;
for(i=0; i<rd2; i++){
for(j=0; j<cols; j++){
temp[rows-1-i][j] = the_image[i][j];
} /* ends loop over j */
} /* ends loop over i */
for(i=rd2; i<rows; i++){
for(j=0; j<cols; j++){
temp[rows-1-i][j] = the_image[i][j];
} /* ends loop over j */
} /* ends loop over i */
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
the_image[i][j] = temp[i][j];
free_image_array(temp, rows);
} /* ends flip_image_array */
/******************************************
*
* read_bmp_image(...
*
* This function reads the image array
* from a bmp file.
*
* It only works for 8-bit images.
*
******************************************/
read_bmp_image(file_name, array)
char *file_name;
short **array;
{
FILE *fp;
int i, j;
int negative = 0,
pad = 0,
place = 0;
long colors = 0,
height = 0,
position = 0,
width = 0;
struct bmpfileheader file_header;
struct bitmapheader bmheader;
struct ctstruct rgb[GRAY_LEVELS+1];
unsigned char uc;
read_bmp_file_header(file_name, &file_header);
read_bm_header(file_name, &bmheader);
if(bmheader.bitsperpixel != 8){
printf("\nCannot read image when bits per"
"pixel is not 8");
exit(1);
}
if(bmheader.colorsused == 0)
colors = GRAY_LEVELS + 1;
else
colors = bmheader.colorsused;
read_color_table(file_name, &rgb, colors);
fp = fopen(file_name, "rb");
fseek(fp, file_header.bitmapoffset, SEEK_SET);
width = bmheader.width;
if(bmheader.height < 0){
height = bmheader.height * (-1);
negative = 1;
}
else
height = bmheader.height;
pad = calculate_pad(width);
for(i=0; i<height; i++){
for(j=0; j<width; j++){
place = fgetc(fp);
uc = (place & 0xff);
place = uc;
array[i][j] = rgb[place].blue;
} /* ends loop over j */
if(pad != 0){
position = fseek(fp, pad, SEEK_CUR);
} /* ends if pad 1= 0 */
} /* ends loop over i */
if(negative == 0)
flip_image_array(array, height, width);
} /* ends read_bmp_image */
/*********************************************
*
* create_allocate_bmp_file(...
*
* The calling routine must set the
* height and width. This routine will set
* everything else.
*
**********************************************/
create_allocate_bmp_file(file_name,
file_header,
bmheader)
char *file_name;
struct bmpfileheader *file_header;
struct bitmapheader *bmheader;
{
char buffer[100];
int i, pad = 0;
FILE *fp;
pad = calculate_pad(bmheader->width);
bmheader->size = 40;
bmheader->planes = 1;
bmheader->bitsperpixel = 8;
bmheader->compression = 0;
bmheader->sizeofbitmap = bmheader->height *
(bmheader->width + pad);
bmheader->horzres = 300;
bmheader->vertres = 300;
bmheader->colorsused = 256;
bmheader->colorsimp = 256;
file_header->filetype = 0x4D42;
file_header->reserved1 = 0;
file_header->reserved2 = 0;
file_header->bitmapoffset = 14 +
bmheader->size +
bmheader->colorsused*4;
file_header->filesize = file_header->bitmapoffset +
bmheader->sizeofbitmap;
if((fp = fopen(file_name, "wb")) == NULL){
printf("\nERROR Could not create file %s",
file_name);
exit(2);
}
/*********************************************
*
* Write the 14-byte bmp file header.
*
*********************************************/
insert_ushort_into_buffer(buffer, 0, file_header->filetype);
fwrite(buffer, 1, 2, fp);
insert_ulong_into_buffer(buffer, 0, file_header->filesize);
fwrite(buffer, 1, 4, fp);
insert_short_into_buffer(buffer, 0, file_header->reserved1);
fwrite(buffer, 1, 2, fp);
insert_short_into_buffer(buffer, 0, file_header->reserved2);
fwrite(buffer, 1, 2, fp);
insert_ulong_into_buffer(buffer, 0, file_header->bitmapoffset);
fwrite(buffer, 1, 4, fp);
/*********************************************
*
* Write the 40-byte bit map header.
*
*********************************************/
insert_ulong_into_buffer(buffer, 0, bmheader->size);
fwrite(buffer, 1, 4, fp);
insert_long_into_buffer(buffer, 0, bmheader->width);
fwrite(buffer, 1, 4, fp);
insert_long_into_buffer(buffer, 0, bmheader->height);
fwrite(buffer, 1, 4, fp);
insert_ushort_into_buffer(buffer, 0, bmheader->planes);
fwrite(buffer, 1, 2, fp);
insert_ushort_into_buffer(buffer, 0, bmheader->bitsperpixel);
fwrite(buffer, 1, 2, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->compression);
fwrite(buffer, 1, 4, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->sizeofbitmap);
fwrite(buffer, 1, 4, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->horzres);
fwrite(buffer, 1, 4, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->vertres);
fwrite(buffer, 1, 4, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->colorsused);
fwrite(buffer, 1, 4, fp);
insert_ulong_into_buffer(buffer, 0, bmheader->colorsimp);
fwrite(buffer, 1, 4, fp);
/*********************************************
*
* Write a blank color table.
* It has 256 entries (number of colors)
* that are each 4 bytes.
*
*********************************************/
buffer[0] = 0x00;
for(i=0; i<(256*4); i++)
fwrite(buffer, 1, 1, fp);
/*********************************************
*
* Write a zero image.
*
*********************************************/
buffer[0] = 0x00;
for(i=0; i<bmheader->sizeofbitmap; i++)
fwrite(buffer, 1, 1, fp);
fclose(fp);
} /* ends create_allocate_bmp_file */
/******************************************
*
* create_bmp_file_if_needed(...
*
* This function allocates a bmp image
* file it it does not exist. It uses
* the header information from the input
* image name.
*
******************************************/
create_bmp_file_if_needed(in_name, out_name, out_image)
char in_name[], out_name[];
short **out_image;
{
int length, width;
struct bmpfileheader file_header;
struct bitmapheader bmheader;
if(does_not_exist(out_name)){
printf("\n\n output file does not exist %s",
out_name);
read_bm_header(in_name, &bmheader);
create_allocate_bmp_file(out_name, &file_header, &bmheader);
printf("\nBFIN> Created %s", out_name);
} /* ends if does_not_exist */
} /* ends bmp_file_if_needed */
/******************************************
*
* write_bmp_image(...
*
* This function writes an image array
* to a bmp image file.
*
******************************************/
write_bmp_image(file_name, array)
char *file_name;
short **array;
{
char *buffer, c;
FILE *image_file;
int pad = 0,
position;
int bytes, i, j;
long height = 0, width = 0;
struct bitmapheader bmheader;
struct bmpfileheader file_header;
struct ctstruct rgb[GRAY_LEVELS+1];
union short_char_union scu;
read_bmp_file_header(file_name, &file_header);
read_bm_header(file_name, &bmheader);
height = bmheader.height;
width = bmheader.width;
if(height < 0) height = height*(-1);
buffer = (char *) malloc(width * sizeof(char ));
for(i=0; i<width; i++)
buffer[i] = '\0';
image_file = fopen(file_name, "rb+");
/****************************************
*
* Write the color table first.
*
****************************************/
position = fseek(image_file, 54, SEEK_SET);
for(i=0; i<GRAY_LEVELS+1; i++){
rgb[i].blue = i;
rgb[i].green = i;
rgb[i].red = i;
} /* ends loop over i */
for(i=0; i<bmheader.colorsused; i++){
buffer[0] = rgb[i].blue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -