📄 testbmp.c
字号:
#include "cips.h"
main(argc, argv)
int argc;
char *argv[];
{
struct bmpfileheader file_header;
struct bitmapheader bmheader;
struct ctstruct rgb[256];
FILE *fp;
short **the_image;
int i, j;
long height = 0, width = 0;
long bitsperpixel = 0;
int negative = 0;
/******************************************
*
*
******************************************/
if(argc < 2){
printf("\ntestbmp file-name.bmp");
exit(0);
}
if(get_image_size(argv[1], &height, &width)){
printf("\nSize of %s rows=%ld cols=%ld",argv[1],width,height);
the_image = allocate_image_array(height, width);
read_image_array(argv[1], the_image);
write_image_array(argv[2], the_image);
free_image_array(the_image, height);
}
#ifdef TESTREAD
if(is_a_tiff(argv[1]))
printf("\n%s is a tif", argv[1]);
else
printf("\n%s is not a tif", argv[1]);
if(get_image_size(argv[1], &height, &width)){
printf("\nSize of %s rows=%ld cols=%ld",argv[1],width,height);
the_image = allocate_image_array(height, width);
read_image_array(argv[1], the_image);
free_image_array(the_image, height);
}
#endif
#ifdef TESTBITS
if(get_bitsperpixel(argv[1], &bitsperpixel))
printf("\nBits per pixel of %s bits=%ld",argv[1],bitsperpixel);
else
printf("\nCould not get the size of %s", argv[1]);
#endif
#ifdef TESTSIZE
if(get_image_size(argv[1], &height, &width))
printf("\nSize of %s rows=%ld cols=%ld",argv[1],width,height);
else
printf("\nCould not get the size of %s", argv[1]);
#endif
#ifdef NEVER
read_bmp_file_header(argv[1], &file_header);
print_bmp_file_header(&file_header);
read_bm_header(argv[1], &bmheader);
print_bm_header(&bmheader);
width = bmheader.width;
if(bmheader.height < 0)
height = bmheader.height * (-1);
else
height = bmheader.height;
the_image = allocate_image_array(height, width);
read_bmp_image(argv[1], the_image);
for(i=0; i<15; i++){
printf("\n");
for(j=0; j<15; j++){
printf("-%3d", the_image[i][j]);
}
}
free_image_array(the_image, height);
#endif
#ifdef TESTWRITE
read_bm_header(argv[1], &bmheader);
width = bmheader.width;
if(bmheader.height < 0)
height = bmheader.height * (-1);
else
height = bmheader.height;
the_image = allocate_image_array(height, width);
for(i=0; i<height; i++){
for(j=0; j<width; j++){
the_image[i][j] = i;
}
}
write_bmp_image(argv[1], the_image);
free_image_array(the_image, height);
#endif
#ifdef IFNEEDED
read_bm_header(argv[1], &bmheader);
width = bmheader.width;
if(bmheader.height < 0)
height = bmheader.height * (-1);
else
height = bmheader.height;
the_image = allocate_image_array(height, width);
create_bmp_file_if_needed(argv[1], argv[2], the_image);
free_image_array(the_image, height);
#endif
#ifdef TESTCREATE
bmheader.height = 222;
bmheader.width = 333;
create_allocate_bmp_file(argv[1], &file_header, &bmheader);
#endif
#ifdef TESTREAD
read_bmp_file_header(argv[1], &file_header);
print_bmp_file_header(&file_header);
read_bm_header(argv[1], &bmheader);
print_bm_header(&bmheader);
width = bmheader.width;
if(bmheader.height < 0)
height = bmheader.height * (-1);
else
height = bmheader.height;
the_image = allocate_image_array(height, width);
read_bmp_image(argv[1], the_image);
for(i=0; i<15; i++){
printf("\n");
for(j=0; j<15; j++){
printf("-%3d", the_image[i][j]);
}
}
free_image_array(the_image, height);
#endif
/******************************************
*
*
*
******************************************/
} /* ends main */
/******************************************
*
* read_bmp_file_header(...
*
* This function reads the bmpfileheader
* structure from the top of a bmp
* image file.
*
******************************************/
read_bmp_file_header(file_name,
file_header)
char *file_name;
struct bmpfileheader *file_header;
{
char buffer[10];
long ll;
short ss;
unsigned long ull;
unsigned short uss;
FILE *fp;
fp = fopen(file_name, "rb");
fread(buffer, 1, 2, fp);
extract_ushort_from_buffer(buffer, 1, 0, &uss);
file_header->filetype = uss;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
file_header->filesize = ull;
fread(buffer, 1, 2, fp);
extract_short_from_buffer(buffer, 1, 0, &ss);
file_header->reserved1 = ss;
fread(buffer, 1, 2, fp);
extract_short_from_buffer(buffer, 1, 0, &ss);
file_header->reserved2 = ss;
fread(buffer, 1, 4, fp);
extract_ulong_from_buffer(buffer, 1, 0, &ull);
file_header->bitmapoffset = ull;
fclose(fp);
} /* ends read_bmp_file_header */
/******************************************
*
* print_bmp_file_header(...
*
* This function printfs parts of the
* bmpfileheader structure.
*
******************************************/
print_bmp_file_header(struct bmpfileheader *file_header)
{
printf("\nfile type %x", file_header->filetype);
printf("\nfile size %d", file_header->filesize);
printf("\nbit map offset %d", file_header->bitmapoffset);
}
/******************************************
*
* read_bm_header(...
*
* This function reads the bitmapheader
* structure from the top of a bmp
* image file.
*
******************************************/
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -