📄 bmpedge.c
字号:
#include "cips.h"
struct bmpfileheader{
unsigned short filetype;
unsigned long filesize;
short reserved1;
short reserved2;
unsigned long bitmapoffset;
};
struct bitmapheader{
unsigned long size;
long width;
long height;
unsigned short planes;
unsigned short bitsperpixel;
unsigned long compression;
unsigned long sizeofbitmap;
unsigned long horzres;
unsigned long vertres;
unsigned long colorsused;
unsigned long colorsimp;
};
struct ctstruct{
unsigned char blue;
unsigned char green;
unsigned char red;
};
main(argc, argv)
int argc;
char *argv[];
{
char image_name[MAX_NAME_LENGTH];
char image_name2[MAX_NAME_LENGTH];
char response[MAX_NAME_LENGTH];
int i, j;
short **the_image, **out_image;
struct tiff_header_struct image_header;
struct bmpfileheader file_header;
struct bitmapheader bmheader;
struct ctstruct rgb[256];
long height, width;
/******************************************
*
* Ensure the command line is correct.
*
******************************************/
if(argc < 3){
printf("\n usage: bmedge input-image output-image");
exit(0);
}
else
printf("\n%s %s %s", argv[0], argv[1], argv[2]);
strcpy(image_name, argv[1]);
strcpy(image_name2, argv[2]);
read_bmp_file_header(image_name, &file_header);
read_bm_header(image_name, &bmheader);
width = bmheader.width;
if(bmheader.height < 0)
height = bmheader.height * (-1);
else
height = bmheader.height;
the_image = allocate_image_array(height, width);
out_image = allocate_image_array(height, width);
read_bmp_image(image_name, the_image);
create_bmp_file_if_needed(image_name, image_name2, the_image);
read_bmp_image(image_name, the_image);
printf("\nMAIN> read %s", image_name);
quick_edge(the_image,
out_image,
1, /* threshold */
90, /* high */
bmheader.height,
bmheader.width,
bmheader.bitsperpixel);
printf("\nMAIN> Back from the edge detector");
write_bmp_image(image_name2, out_image);
printf("\nMAIN> wrote %s", image_name2);
free_image_array(the_image,
image_header.image_length);
free_image_array(out_image,
image_header.image_length);
} /* ends main */
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(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(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(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(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(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(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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -