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");
printf(" 儌僲僋儘奒挷夋憸乮pgm宍幃乯弌椡儖乕僠儞\n");
printf("-----------------------------------------------------\n");
printf("弌椡僼傽僀儖柤 (*.pgm) : ");
scanf("%s",file_name);
//以二进制写方式打开文件
fp = fopen(file_name, "wb");
//将一指定的字符串写入文件内
fputs( "P5\n", fp );
fputs( "# Created by Image Processing\n", fp );
fprintf( fp, "%d %d\n", x_size2, y_size2 );
fprintf( fp, "%d\n", MAX_BRIGHTNESS );
for ( y = 0; y < y_size2; y ++ ){
for ( x = 0; x < x_size2; x ++ ){
fputc( image2[y][x], fp );
}
}
printf("僨乕僞偼惓偟偔弌椡偝傟傑偟偨丏\n");
printf("-----------------------------------------------------\n");
fclose(fp);
}
我在源文件中是这样写的:
500.c
#include "stdio.h"
#include "mypgm.h"
void main()
{
int i,j,k,l;
x_size2=500;
y_size2=500;
for(i=0;i<x_size2;i++)
{
for(j=0;j<y_size2;j++)
{
image2[i][j]=100;
}
}
save_image_data();
//下面的部分不对
load_image_data();
for(k=0;k<x_size1;k++)
{
for(l=0;l<y_size1;l++)
{
printf(image1[k][l]);
}
}
}
在 load_image_data();函数之前,运行结果能够在输入的路径下(比如运行时输入C:\test.pgm)生成一个像素为500*500,灰度为100的.pgm格式的图片,老师要求将该图像在VC++6.0运行的窗口输出出来,我该怎么输出呢?上面500.c中load_image_data();下面的部分是不正确的,我以为load_image_data()是读取该图像,并把每一点的灰度值都存进了二位数组image1[x][y],可是怎么把图像数出来呢?求指导!