📄 wtiff.c
字号:
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);
round_off_image_size(image_header, &l, &w);
k = l * w;
if(image_header->bits_per_pixel == 8)
k = k/2;
else
k = k/4;
k++;
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
image[i][j] = 0;
j = sizeof(short) * ROWS * COLS;
for(i=0; i<k; i++){
bytes_written = fwrite(image, 1, j, image_file);
printf("\n wrote %d bytes", bytes_written);
}
fclose(image_file);
} /* ends create_allocate_tiff_file */
/*********************************************
*
* write_array_into_tiff_file(...
*
* This function takes an array of shorts and
* writes them into an existing tiff image file.
*
**********************************************/
write_array_into_tiff_image(image_file_name, array,
il, ie, ll, le)
char image_file_name[];
int il, ie, ll, le;
short array[ROWS][COLS];
{
char buffer[COLS];
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);
position = seek_to_first_line(image_file,
&image_header, il);
for(i=0; i<(ll-il); i++){
offset = (ie-1)/
(8/image_header.bits_per_pixel);
position = fseek(image_file, offset,
SEEK_CUR);
bytes_written = write_line(image_file, array,
i, &image_header,
ie, le);
position = seek_to_end_of_line(image_file,
le,
&image_header);
position = fseek(image_file, 1, SEEK_CUR);
} /* ends loop over i */
closed = fclose(image_file);
} /* ends write_array_into_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).
*
**********************************************/
write_line(image_file, array, line_number,
image_header, ie, le)
FILE *image_file;
int ie, le, line_number;
short array[ROWS][COLS];
struct tiff_header_struct *image_header;
{
char buffer[COLS], first, second;
float a, b;
int bytes_written, i;
unsigned int bytes_to_write;
union short_char_union scu;
for(i=0; i<COLS; 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);
return(bytes_written);
} /* ends write_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 + -