📄 bigc.c
字号:
*
* Write out the entries into the
* Image File Directory.
*
****************************************/
/* New Subfile Type */
buffer[0] = 0xFE;
buffer[1] = 0x00;
buffer[2] = 0x03;
buffer[3] = 0x00;
buffer[4] = 0x01;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
buffer[8] = 0x00;
buffer[9] = 0x00;
buffer[10] = 0x00;
buffer[11] = 0x00;
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Subfile Type */
buffer[0] = 0xFF;
buffer[1] = 0x00;
buffer[2] = 0x03;
buffer[3] = 0x00;
buffer[4] = 0x01;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
buffer[8] = 0x01;
buffer[9] = 0x00;
buffer[10] = 0x00;
buffer[11] = 0x00;
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Image Width */
insert_short_into_buffer(buffer, 0, 256);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->image_width);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Image Length */
insert_short_into_buffer(buffer, 0, 257);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->image_length);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Bits Per Sample */
insert_short_into_buffer(buffer, 0, 258);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->bits_per_pixel);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Compression - None */
insert_short_into_buffer(buffer, 0, 259);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Photometric Interpretation */
/* set to 1 because BLACK is ZERO */
insert_short_into_buffer(buffer, 0, 262);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Strip Offset */
/* start after software name at 296 */
insert_short_into_buffer(buffer, 0, 273);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 296);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Samples per Pixel */
insert_short_into_buffer(buffer, 0, 277);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* clear buffer */
for(i=0; i<12; i++) buffer[i] = 0x00;
/* Rows Per Strip 1 strip for the entire image */
/* use 2E32 - 1, which is max */
insert_short_into_buffer(buffer, 0, 278);
insert_short_into_buffer(buffer, 2, 4);
insert_short_into_buffer(buffer, 4, 1);
insert_long_into_buffer(buffer, 8, 4294967295);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Strip Byte Counts */
/* this = image width times length */
insert_short_into_buffer(buffer, 0, 279);
insert_short_into_buffer(buffer, 2, 4);
insert_short_into_buffer(buffer, 4, 1);
insert_long_into_buffer(buffer, 8,
(long)(image_header->image_length *
image_header->image_width));
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Min Sample Value */
insert_short_into_buffer(buffer, 0, 280);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 0);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Max Sample Value */
insert_short_into_buffer(buffer, 0, 281);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
if(image_header->bits_per_pixel == 8)
insert_short_into_buffer(buffer, 8, 255);
else
insert_short_into_buffer(buffer, 8, 15);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* X Resolution */
/* Store the 8 bytes for this value
starting at 230 */
insert_short_into_buffer(buffer, 0, 282);
insert_short_into_buffer(buffer, 2, 5);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 230);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Y Resolution */
/* Store the 8 bytes for this value
starting at 238 */
insert_short_into_buffer(buffer, 0, 283);
insert_short_into_buffer(buffer, 2, 5);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 238);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* clear buffer */
for(i=0; i<12; i++) buffer[i] = 0x00;
/* Planer Configuration */
/* chunky */
insert_short_into_buffer(buffer, 0, 284);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Resolution Unit */
/* inches */
insert_short_into_buffer(buffer, 0, 296);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 2);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Software */
/* Put this a 246, 50 bytes */
insert_short_into_buffer(buffer, 0, 305);
insert_short_into_buffer(buffer, 2, 2);
insert_short_into_buffer(buffer, 4, 50);
insert_short_into_buffer(buffer, 8, 246);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Offset to next IFD (0 means no more IFD's) */
for(i=0; i<12; i++) buffer[i] = 0x00;
bytes_written = fwrite(buffer, 1, 4, image_file);
printf("\n wrote %d bytes", bytes_written);
/* clear buffer */
for(i=0; i<12; i++) buffer[i] = 0x00;
/* Now store the X Resolution
first long is numerator
second long is denominator */
insert_long_into_buffer(buffer, 0, 300L);
insert_long_into_buffer(buffer, 4, 1L);
bytes_written = fwrite(buffer, 1, 8, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Now store the Y Resolution
first long is numerator
second long is denominator */
insert_long_into_buffer(buffer, 0, 300L);
insert_long_into_buffer(buffer, 4, 1L);
bytes_written = fwrite(buffer, 1, 8, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Now store the software tag */
for(i=0; i<50; i++) long_buffer[i] = '\0';
strcpy(long_buffer,
"Dwayne Phillips C Image Processing System 1993");
long_buffer[46] = '\0';
long_buffer[47] = '\0';
long_buffer[48] = '\0';
long_buffer[49] = '\0';
bytes_written = fwrite(long_buffer, 1, 50,
image_file);
printf("\n wrote %d bytes", bytes_written);
printf("\n%s", long_buffer);
/***************************************
*
* Now write the image data.
*
****************************************/
printf("\n length is %ld",
image_header->image_length);
printf("\n width is %ld",
image_header->image_width);
k = image_header->image_width;
if(image_header->bits_per_pixel == 4)
k = k/2;
image_buffer = (char *) malloc(k * sizeof(char ));
for(i=0; i<k; i++)
image_buffer[i] = 0x00;
for(i=0; i<image_header->image_length; i++){
bytes_written = fwrite(image_buffer, 1, k, image_file);
/***printf("\n wrote %d bytes", bytes_written);***/
}
fclose(image_file);
free(image_buffer);
} /* ends bcreate_allocate_tiff_file */
/*********************************************
*
* write_array_into_tiff_file(...
*
* This function takes an array of shorts and
* writes them into an existing tiff image file.
*
**********************************************/
bwrite_tiff_image(image_file_name, array)
char image_file_name[];
short **array;
{
FILE *image_file;
int bytes_written,
closed,
i,
position,
written;
float a;
long line_length,
offset;
struct tiff_header_struct image_header;
read_tiff_header(image_file_name, &image_header);
/***********************************************
*
* Procedure:
* Seek to the strip offset where the data begins.
* Seek to the first line you want.
* Loop over the lines you want to write.
* Seek to the first element of the line.
* Write the line.
* Seek to the end of the data in that line.
*
************************************************/
image_file = fopen(image_file_name, "rb+");
position = fseek(image_file,
image_header.strip_offset,
SEEK_SET);
for(i=0; i<image_header.image_length; i++){
bytes_written = bwrite_line(image_file, array,
i, &image_header,
0, image_header.image_width);
} /* ends loop over i */
closed = fclose(image_file);
} /* ends bwrite_tiff_image */
/*********************************************
*
* write_line(...
*
* This function takes an array of shorts,
* extracts the numbers and puts them into
* a buffer, then writes this buffer into a
* tiff file on disk. The process depends on
* the number of bits per pixel used in the
* file (4 or 8).
*
**********************************************/
bwrite_line(image_file, array, line_number,
image_header, ie, le)
FILE *image_file;
int ie, le, line_number;
short **array;
struct tiff_header_struct *image_header;
{
char *buffer, first, second;
float a, b;
int bytes_written, i;
unsigned int bytes_to_write;
union short_char_union scu;
buffer = (char *) malloc(image_header->image_width * sizeof(char ));
for(i=0; i<image_header->image_width; i++)
buffer[i] = '\0';
bytes_to_write = (le-ie)/
(8/image_header->bits_per_pixel);
for(i=0; i<bytes_to_write; i++){
/**********************************************
*
* Use unions defined in cips.h to stuff shorts
* into bytess.
*
**********************************************/
if(image_header->bits_per_pixel == 8){
scu.s_num = 0;
scu.s_num = array[line_number][i];
buffer[i] = scu.s_alpha[0];
} /* ends if bits_per_pixel == 8 */
if(image_header->bits_per_pixel == 4){
scu.s_num = 0;
scu.s_num = array[line_number][i*2];
first = scu.s_alpha[0] << 4;
scu.s_num = 0;
scu.s_num = array[line_number][i*2];
second = scu.s_alpha[0] & 0X000F;
buffer[i] = first | second;
} /* ends if bits_per_pixel == 4 */
} /* ends loop over i */
bytes_written = fwrite(buffer, 1, bytes_to_write,
image_file);
free(buffer);
return(bytes_written);
} /* ends bwrite_line */
/***************************************
*
* 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_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_short_into_buffer */
/***************************************
*
* round_off_image_size(...
*
* This takes the image header and rounds
* it off to a multiple of ROWS and COLS.
* e.g. if width=123 it returns 1.
*
***************************************/
round_off_image_size(image_header, length, width)
int *length, *width;
struct tiff_header_struct *image_header;
{
*length = (ROWS-10 + image_header->image_length)/ROWS;
*width = (COLS-10 + image_header->image_width)/COLS;
} /* ends round_off_image_size */
/***********************************************
*
* does_not_exist(...
*
* This function checks the disk to see if
* a file exists. If the file is there this
* function returns a 0, if it does not exist
* this function returns a 1.
*
***********************************************/
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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -