C - PGM和PPM - 动态分配表,图像切成两半

时间:2017-01-07 23:08:54

标签: c arrays 2d dynamically-generated

我有一个适用于PGM图像的程序。我必须重新制作它,因此它也适用于PPM图像。我现在使用动态分配的表将图像存储在内存中。问题是它在PGM图像上运行良好,但PPM减少了一半。 Input&output 这是怎么回事?这些是我认为可疑的地方:

这是我创建表格的方式:

obraz->piksele=(int**)malloc(obraz->wymy*sizeof(int *));
for(i=0; i<obraz->wymy; i++)
{
    obraz->piksele[i]=(int*)malloc(obraz->wymx*sizeof(int));
}
  for (i=0;i<obraz->wymy;i++) {
    for (j=0;j<obraz->wymx;j++) {
      fscanf(plik_we,"%d",&(obraz->piksele[i][j]));
    }
    }
  }
  return obraz->wymx*obraz->wymy;
}         

这就是我保存新文件的方式:

int zapisz(FILE *plik_wy,TObraz *obraz)
{
    int i,j;
    if(obraz->format==2) 
        fprintf(plik_wy,"P2\n"); 
    else 
        fprintf(plik_wy,"P3\n");
    fprintf(plik_wy,"%d %d\n",obraz->wymx,obraz->wymy);
    fprintf(plik_wy,"%d\n",obraz->szarosci);
    for(i=0;i<obraz->wymy;i++)
    {
        for(j=0;j<obraz->wymx;j++)
        {
            fprintf(plik_wy,"%d ",obraz->piksele[i][j]);
            if(j>1 && j%15==0) 
                fprintf(plik_wy,"\n");
        }
    }
    return 0;  
}

也是TObraz的结构:

typedef struct
{
  int **piksele;
  int format;
  int wymx;
  int wymy;
  int szarosci;
} TObraz;

1 个答案:

答案 0 :(得分:0)

您正在做的malloc与PGM(灰度)和PPM(彩色图像)文件相同。在您的结果中,PPM图像不会切成两半,切成1/3。

首先,您正在执行的malloc应该是:

obraz->piksele=(int**)malloc(obraz->wymy*sizeof(int *));
for(i=0; i<obraz->wymy; i++)
{
    obraz->piksele[i]=(int*)malloc(3 * obraz->wymx*sizeof(int));
}

根据您的最终申请,可能会对文件保存进行更多更改。

每种格式规范的参考:

http://netpbm.sourceforge.net/doc/pgm.html

http://netpbm.sourceforge.net/doc/ppm.html