📄 imgio.c
字号:
printf ( "\n" );
printf ( "PPMB_READ: Fatal error!\n" );
printf ( " Unable to allocate memory for data.\n" );
printf ( " Seeking %d bytes.\n", numbytes );
return ERROR;
}
*garray = (image*)malloc(numbytes);
if ( *garray == NULL ) {
printf ( "\n" );
printf ( "PPMB_READ: Fatal error!\n" );
printf ( " Unable to allocate memory for data.\n" );
printf ( " Seeking %d bytes.\n", numbytes );
return ERROR;
}
*barray = (image*)malloc(numbytes);
if (*barray == NULL) {
printf ( "\n" );
printf ( "PPMB_READ: Fatal error!\n" );
printf ( " Unable to allocate memory for data.\n" );
printf ( " Seeking %d bytes.\n", numbytes );
return ERROR;
}
/* Read the data. */
result = ppmb_read_data ( filein, *xsize, *ysize, *rarray, *garray, *barray );
if ( result == ERROR ) {
printf ( "\n" );
printf ( "PPMB_READ: Fatal error!\n" );
printf ( " PPMB_READ_DATA failed.\n" );
return ERROR;
}
/* Close the file. */
fclose ( filein );
return SUCCESS;
}
/******************************************************************************/
int ppmb_read_data ( FILE *filein, int xsize, int ysize, image *rarray,
image *garray, image *barray )
{
int i;
int int_val;
image *indexb;
image *indexg;
image *indexr;
int j;
int k;
int numval;
indexr = rarray;
indexg = garray;
indexb = barray;
numval = 0;
for ( j = 0; j < ysize; j++ ) {
for ( i = 0; i < xsize; i++ ) {
for ( k = 0; k < 3; k++ ) {
int_val = fgetc ( filein );
if ( int_val == EOF ) {
printf ( "\n" );
printf ( "PPMB_READ_DATA: Failed reading data byte %d.\n", numval );
return ERROR;
}
else {
if ( k == 0 ) {
*indexr = int_val;
indexr = indexr + 1;
}
else if ( k == 1 ) {
*indexg = int_val;
indexg = indexg + 1;
}
else if ( k == 2 ) {
*indexb = int_val;
indexb = indexb + 1;
}
}
numval = numval + 1;
}
}
}
return SUCCESS;
}
/******************************************************************************/
int ppmb_read_header ( FILE *filein, int *xsize, int *ysize, int *maxrgb )
{
int c_val;
int count;
int flag;
int nchar;
int state;
char string[80];
state = 0;
nchar = 0;
for ( ;; ) {
c_val = fgetc ( filein );
if ( c_val == EOF ) {
return ERROR;
}
if (c_val == '#')
{
while (c_val !='\n') c_val = fgetc ( filein );
c_val = fgetc ( filein );
}
/* If not whitespace, add the character to the current string.*/
flag = isspace ( c_val );
if ( !flag ) {
string[nchar] = c_val;
nchar = nchar + 1;
}
/* See if we have finished an old item, or begun a new one. */
if ( state == 0 ) {
if ( !flag ) {
state = 1;
}
else {
return ERROR;
}
}
else if ( state == 1 ) {
if ( flag ) {
string[nchar] = 0;
nchar = nchar + 1;
if ( strcmp ( string, "P6" ) != 0 && strcmp ( string, "p6" ) != 0 ) {
printf ( "\n" );
printf ( "PPMB_READ_HEADER: Fatal error.\n" );
printf ( " Bad magic number = %s.\n", string );
return ERROR;
}
nchar = 0;
state = 2;
}
}
else if ( state == 2 ) {
if ( !flag ) {
state = 3;
}
}
else if ( state == 3 ) {
if ( flag ) {
string[nchar] = 0;
nchar = nchar + 1;
count = sscanf ( string, "%d", xsize );
if ( count == EOF ) {
return ERROR;
}
nchar = 0;
state = 4;
}
}
else if ( state == 4 ) {
if ( !flag ) {
state = 5;
}
}
else if ( state == 5 ) {
if ( flag ) {
string[nchar] = 0;
nchar = nchar + 1;
count = sscanf ( string, "%d", ysize );
if ( count == EOF ) {
return ERROR;
}
nchar = 0;
state = 6;
}
}
else if ( state == 6 ) {
if ( !flag ) {
state = 7;
}
}
else if ( state == 7 ) {
if ( flag ) {
string[nchar] = 0;
nchar = nchar + 1;
count = sscanf ( string, "%d", maxrgb );
if ( count == EOF ) {
return ERROR;
}
nchar = 0;
return SUCCESS;
}
}
}
}
/******************************************************************************/
int WritePPM ( char *fileout_name, int xsize, int ysize, int maxrgb,
image *rarray, image *garray, image *barray )
{
FILE *fileout;
int result;
/* Open the output file.*/
fileout = fopen ( fileout_name, "wb" );
if ( fileout == NULL ) {
printf ( "\n" );
printf ( "PPMB_WRITE: Fatal error!\n" );
printf ( " Cannot open the output file %s.\n", fileout_name );
return ERROR;
}
/* Write the header. */
result = ppmb_write_header ( fileout, xsize, ysize, maxrgb );
if ( result == ERROR ) {
printf ( "\n" );
printf ( "PPMB_WRITE: Fatal error!\n" );
printf ( " PPMB_WRITE_HEADER failed.\n" );
return ERROR;
}
/* Write the data. */
result = ppmb_write_data ( fileout, xsize, ysize, rarray, garray, barray );
if ( result == ERROR ) {
printf ( "\n" );
printf ( "PPMB_WRITE: Fatal error!\n" );
printf ( " PPMB_WRITE_DATA failed.\n" );
return ERROR;
}
/* Close the file. */
fclose ( fileout );
return SUCCESS;
}
/******************************************************************************/
int ppmb_write_data ( FILE *fileout, int xsize, int ysize, image *rarray, image *garray, image *barray )
{
int i;
image *indexb;
image *indexg;
image *indexr;
int j;
indexr = rarray;
indexg = garray;
indexb = barray;
for ( j = 0; j < ysize; j++ ) {
for ( i = 0; i < xsize; i++ ) {
if (*indexr>255) fputc(255,fileout);
else if (*indexr<0) fputc(0,fileout);
else fputc ( *indexr, fileout );
if (*indexg>255) fputc(255,fileout);
else if (*indexg<0) fputc(0,fileout);
else fputc ( *indexg, fileout );
if (*indexb>255) fputc(255,fileout);
else if (*indexb<0) fputc(0,fileout);
else fputc ( *indexb, fileout );
indexr = indexr + 1;
indexg = indexg + 1;
indexb = indexb + 1;
}
}
return SUCCESS;
}
/******************************************************************************/
int ppmb_write_header ( FILE *fileout, int xsize, int ysize, int maxrgb )
{
fprintf ( fileout, "P6\n%d %d\n%d\n", xsize, ysize, maxrgb );
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -