VC++6.0 用C语言怎么办pgm图像
VC++6.0 用C语言怎么处理pgm图像
VC++6.0 用C语言输出一个像素为500*500的图像,灰度为个g(i,j)=100。
老师给了一个头文件如下:
mypgm.h
#define MAX_IMAGESIZE 1024
#define MAX_BRIGHTNESS 255
#define GRAYLEVEL 256 /* 灰度级 */
#define MAX_FILENAME 256 /* 最大文件名 */
#define MAX_BUFFERSIZE 256 /* 最大缓存 */
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE],
image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
int x_size1, y_size1,
x_size2, y_size2;
void load_image_data( );
void save_image_data( );
void load_image_data( )
{
char file_name[MAX_FILENAME];
char buffer[MAX_BUFFERSIZE];
FILE *fp;
int max_gray;
int x, y;
printf("-----------------------------------------------------\n");
printf(" 儌僲僋儘奒挷夋憸擖椡儖乕僠儞\n");
printf("-----------------------------------------------------\n");
printf("僼傽僀儖宍幃偼 pgm, 僶僀僫儕宍幃偲偟傑偡丏\n");
printf("擖椡僼傽僀儖柤 (*.pgm) : ");
scanf("%s",file_name);
fp = fopen( file_name, "rb" );/*读写打开一个二进制文件,只允许读写数据*/
if ( NULL == fp ){
printf("偦偺柤慜偺僼傽僀儖偼懚嵼偟傑偣傫丏\n");
exit(1);
/*exit()是用来正常结束进程的,exit(0)程序结束时返回0给系统,exit(1)程序结束时返回1给系统,
exit(n)程序结束时返回n给系统,这样系统就知道程序是怎么结束的~是出错结束的呢 还是正常结束的呢,一看返回值就知道了*/
}
/* fgets() 函数的功能是从fp所指文件中读入MAX_BUFFERSIZE-1个字符放入buffer为起始地址的空间内;
如果在未读满MAX_BUFFERSIZE-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),
则结束本次读操作,读入的字符串中最后包含读到的换行符 */
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != 'P' || buffer[1] != '5' ){
printf("僼傽僀儖偺僼僅乕儅僢僩偑 P5 偲偼堎側傝傑偡丏\n");
exit(1);
}
x_size1 = 0;
y_size1 = 0;
while ( x_size1 == 0 || y_size1 == 0 ){
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != '#' ){
sscanf( buffer, "%d %d", &x_size1, &y_size1 );
}
}
max_gray = 0;
while ( max_gray == 0 ){
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != '#' ){
sscanf( buffer, "%d", &max_gray );
}
}
printf("墶偺夋慺悢 = %d, 廲偺夋慺悢 = %d\n", x_size1, y_size1 );
printf("嵟戝奒挷抣 = %d\n",max_gray);
if ( x_size1 > MAX_IMAGESIZE || y_size1 > MAX_IMAGESIZE ){
printf("憐掕抣 %d x %d 傪挻偊偰偄傑偡丏\n",
MAX_IMAGESIZE, MAX_IMAGESIZE);
printf("傕偆彮偟彫偝側夋憸傪巊偭偰壓偝偄丏\n");
exit(1);
}
if ( max_gray != MAX_BRIGHTNESS ){
printf("嵟戝奒挷抣偑晄揔愗偱偡丏\n");
exit(1);
}
for ( y = 0; y < y_size1; y ++ ){
for ( x = 0; x < x_size1; x ++ ){
image1[y][x] = (unsigned char)fgetc( fp );
}
}
printf("僨乕僞偼惓偟偔撉傒崬傑傟傑偟偨丏\n");
printf("-----------------------------------------------------\n");
fclose(fp);
}
void save_image_data()
{
char file_name[MAX_FILENAME];
FILE *fp;
int x, y;
printf("-----------------------------------------------------\n");
VC++6.0 用C语言输出一个像素为500*500的图像,灰度为个g(i,j)=100。
老师给了一个头文件如下:
mypgm.h
#define MAX_IMAGESIZE 1024
#define MAX_BRIGHTNESS 255
#define GRAYLEVEL 256 /* 灰度级 */
#define MAX_FILENAME 256 /* 最大文件名 */
#define MAX_BUFFERSIZE 256 /* 最大缓存 */
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE],
image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
int x_size1, y_size1,
x_size2, y_size2;
void load_image_data( );
void save_image_data( );
void load_image_data( )
{
char file_name[MAX_FILENAME];
char buffer[MAX_BUFFERSIZE];
FILE *fp;
int max_gray;
int x, y;
printf("-----------------------------------------------------\n");
printf(" 儌僲僋儘奒挷夋憸擖椡儖乕僠儞\n");
printf("-----------------------------------------------------\n");
printf("僼傽僀儖宍幃偼 pgm, 僶僀僫儕宍幃偲偟傑偡丏\n");
printf("擖椡僼傽僀儖柤 (*.pgm) : ");
scanf("%s",file_name);
fp = fopen( file_name, "rb" );/*读写打开一个二进制文件,只允许读写数据*/
if ( NULL == fp ){
printf("偦偺柤慜偺僼傽僀儖偼懚嵼偟傑偣傫丏\n");
exit(1);
/*exit()是用来正常结束进程的,exit(0)程序结束时返回0给系统,exit(1)程序结束时返回1给系统,
exit(n)程序结束时返回n给系统,这样系统就知道程序是怎么结束的~是出错结束的呢 还是正常结束的呢,一看返回值就知道了*/
}
/* fgets() 函数的功能是从fp所指文件中读入MAX_BUFFERSIZE-1个字符放入buffer为起始地址的空间内;
如果在未读满MAX_BUFFERSIZE-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),
则结束本次读操作,读入的字符串中最后包含读到的换行符 */
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != 'P' || buffer[1] != '5' ){
printf("僼傽僀儖偺僼僅乕儅僢僩偑 P5 偲偼堎側傝傑偡丏\n");
exit(1);
}
x_size1 = 0;
y_size1 = 0;
while ( x_size1 == 0 || y_size1 == 0 ){
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != '#' ){
sscanf( buffer, "%d %d", &x_size1, &y_size1 );
}
}
max_gray = 0;
while ( max_gray == 0 ){
fgets( buffer, MAX_BUFFERSIZE, fp );
if ( buffer[0] != '#' ){
sscanf( buffer, "%d", &max_gray );
}
}
printf("墶偺夋慺悢 = %d, 廲偺夋慺悢 = %d\n", x_size1, y_size1 );
printf("嵟戝奒挷抣 = %d\n",max_gray);
if ( x_size1 > MAX_IMAGESIZE || y_size1 > MAX_IMAGESIZE ){
printf("憐掕抣 %d x %d 傪挻偊偰偄傑偡丏\n",
MAX_IMAGESIZE, MAX_IMAGESIZE);
printf("傕偆彮偟彫偝側夋憸傪巊偭偰壓偝偄丏\n");
exit(1);
}
if ( max_gray != MAX_BRIGHTNESS ){
printf("嵟戝奒挷抣偑晄揔愗偱偡丏\n");
exit(1);
}
for ( y = 0; y < y_size1; y ++ ){
for ( x = 0; x < x_size1; x ++ ){
image1[y][x] = (unsigned char)fgetc( fp );
}
}
printf("僨乕僞偼惓偟偔撉傒崬傑傟傑偟偨丏\n");
printf("-----------------------------------------------------\n");
fclose(fp);
}
void save_image_data()
{
char file_name[MAX_FILENAME];
FILE *fp;
int x, y;
printf("-----------------------------------------------------\n");