📄 bmpedge.c
字号:
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(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 bcreate_file_if_needed */
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;
fwrite(buffer , 1, 1, image_file);
buffer[0] = rgb[i].green;
fwrite(buffer , 1, 1, image_file);
buffer[0] = rgb[i].red;
fwrite(buffer , 1, 1, image_file);
buffer[0] = 0x00;
fwrite(buffer , 1, 1, image_file);
} /* ends loop over i */
position = fseek(image_file,
file_header.bitmapoffset,
SEEK_SET);
pad = calculate_pad(width);
for(i=0; i<height; i++){
for(j=0; j<width; j++){
if(bmheader.bitsperpixel == 8){
scu.s_num = 0;
if(bmheader.height > 0)
scu.s_num = array[height-1-i][j];
else
scu.s_num = array[i][j];
buffer[j] = scu.s_alpha[0];
} /* ends if bits_per_pixel == 8 */
else{
printf("\nERROR bitsperpixel is not 8");
exit(1);
}
} /* ends loop over j */
bytes = fwrite(buffer, 1, width, image_file);
if(pad != 0){
for(j=0; j<pad; j++)
buffer[j] = 0x00;
fwrite(buffer, 1, pad, image_file);
} /* ends if pad != 0 */
} /* ends loop over i */
fclose(image_file);
free(buffer);
} /* ends write_bmp_image */
int calculate_pad(width)
long width;
{
int pad = 0;
pad = ( (width%4) == 0) ? 0 : (4-(width%4));
return(pad);
} /* ends calculate_pad */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -