📄 stuff.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[];
{
struct bmpfileheader file_header;
struct bitmapheader bmheader;
struct ctstruct rgb[256];
FILE *fp;
short **the_image;
int i, j;
long height = 0, width = 0;
int negative = 0;
/******************************************
*
*
******************************************/
if(argc < 2){
printf("\ntestbmp file-name.bmp");
exit(0);
}
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);
#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 */
does_not_exist(file_name)
char file_name[];
{
FILE *image_file;
int result;
result = 1;
image_file = fopen(file_name, "rb");
if(image_file != NULL){
result = 0;
fclose(image_file);
}
return(result);
} /* ends does_not_exist */
/***************************************
*
* insert_short_into_buffer(...
*
* This inserts a two byte short into a
* buffer of characters. It does this
* is LSB order.
*
***************************************/
insert_short_into_buffer(buffer, start, number)
char buffer[];
int start;
short number;
{
union short_char_union lsu;
lsu.s_num = number;
buffer[start+0] = lsu.s_alpha[0];
buffer[start+1] = lsu.s_alpha[1];
} /* ends insert_short_into_buffer */
insert_ushort_into_buffer(buffer, start, number)
char buffer[];
int start;
unsigned short number;
{
union ushort_char_union lsu;
lsu.s_num = number;
buffer[start+0] = lsu.s_alpha[0];
buffer[start+1] = lsu.s_alpha[1];
} /* ends insert_short_into_buffer */
/***************************************
*
* insert_long_into_buffer(...
*
* This inserts a four byte long into a
* buffer of characters. It does this
* is LSB order.
*
***************************************/
insert_long_into_buffer(buffer, start, number)
char buffer[];
int start;
long number;
{
union long_char_union lsu;
lsu.l_num = number;
buffer[start+0] = lsu.l_alpha[0];
buffer[start+1] = lsu.l_alpha[1];
buffer[start+2] = lsu.l_alpha[2];
buffer[start+3] = lsu.l_alpha[3];
} /* ends insert_long_into_buffer */
insert_ulong_into_buffer(buffer, start, number)
char buffer[];
int start;
unsigned long number;
{
union ulong_char_union lsu;
lsu.l_num = number;
buffer[start+0] = lsu.l_alpha[0];
buffer[start+1] = lsu.l_alpha[1];
buffer[start+2] = lsu.l_alpha[2];
buffer[start+3] = lsu.l_alpha[3];
} /* ends insert_ulong_into_buffer */
/****************************************
*
* extract_long_from_buffer(...
*
* This takes a four byte long out of a
* buffer of characters.
*
* It is important to know the byte order
* LSB or MSB.
*
****************************************/
extract_long_from_buffer(buffer, lsb, start, number)
char buffer[];
int lsb, start;
long *number;
{
int i;
union long_char_union lcu;
if(lsb == 1){
lcu.l_alpha[0] = buffer[start+0];
lcu.l_alpha[1] = buffer[start+1];
lcu.l_alpha[2] = buffer[start+2];
lcu.l_alpha[3] = buffer[start+3];
} /* ends if lsb = 1 */
if(lsb == 0){
lcu.l_alpha[0] = buffer[start+3];
lcu.l_alpha[1] = buffer[start+2];
lcu.l_alpha[2] = buffer[start+1];
lcu.l_alpha[3] = buffer[start+0];
} /* ends if lsb = 0 */
*number = lcu.l_num;
} /* ends extract_long_from_buffer */
extract_ulong_from_buffer(buffer, lsb, start, number)
char buffer[];
int lsb, start;
unsigned long *number;
{
int i;
union ulong_char_union lcu;
if(lsb == 1){
lcu.l_alpha[0] = buffer[start+0];
lcu.l_alpha[1] = buffer[start+1];
lcu.l_alpha[2] = buffer[start+2];
lcu.l_alpha[3] = buffer[start+3];
} /* ends if lsb = 1 */
if(lsb == 0){
lcu.l_alpha[0] = buffer[start+3];
lcu.l_alpha[1] = buffer[start+2];
lcu.l_alpha[2] = buffer[start+1];
lcu.l_alpha[3] = buffer[start+0];
} /* ends if lsb = 0 */
*number = lcu.l_num;
} /* ends extract_long_from_buffer */
/****************************************
*
* extract_short_from_buffer(...
*
* This takes a two byte short out of a
* buffer of characters.
*
* It is important to know the byte order
* LSB or MSB.
*
****************************************/
extract_short_from_buffer(buffer, lsb, start, number)
char buffer[];
int lsb, start;
short *number;
{
int i;
union short_char_union lcu;
if(lsb == 1){
lcu.s_alpha[0] = buffer[start+0];
lcu.s_alpha[1] = buffer[start+1];
} /* ends if lsb = 1 */
if(lsb == 0){
lcu.s_alpha[0] = buffer[start+1];
lcu.s_alpha[1] = buffer[start+0];
} /* ends if lsb = 0 */
*number = lcu.s_num;
} /* ends extract_short_from_buffer */
extract_ushort_from_buffer(buffer, lsb, start, number)
char buffer[];
int lsb, start;
unsigned short *number;
{
int i;
union ushort_char_union lcu;
if(lsb == 1){
lcu.s_alpha[0] = buffer[start+0];
lcu.s_alpha[1] = buffer[start+1];
} /* ends if lsb = 1 */
if(lsb == 0){
lcu.s_alpha[0] = buffer[start+1];
lcu.s_alpha[1] = buffer[start+0];
} /* ends if lsb = 0 */
*number = lcu.s_num;
} /* ends extract_short_from_buffer */
short **allocate_image_array(length, width)
long length, width;
{
int i;
short **the_array;
the_array = malloc(length * sizeof(short *));
for(i=0; i<length; i++){
the_array[i] = malloc(width * sizeof(short ));
if(the_array[i] == '\0'){
printf("\n\tmalloc of the_image[%d] failed", i);
} /* ends if */
} /* ends loop over i */
return(the_array);
} /* ends allocate_image_array */
int free_image_array(the_array, length)
short **the_array;
long length;
{
int i;
for(i=0; i<length; i++)
free(the_array[i]);
return(1);
} /* ends free_image_array */
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -