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

标签 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;

最佳答案

您正在执行的 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

关于C - PGM 和 PPM - 动态分配表,图像切成两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527590/

相关文章:

Python/Numpy - 计算相等数组元素的总和

javascript - jQuery 数组乘法

c - 如何在 C 中将字符数组重置为 0/NULL?

c - 在 C 中存储 char* 数组

C 指针和结构

java - 无法实现二维机构的运动

python - 如何有效地清除 pygame alpha 层?

c - 如何在 C 中使用指针打印带有结构的变量?

c - 数组 b[] 的值如何用另一个函数的另一个数组 a[] 值填充?

java - 缺少 Android Rect set() 方法