1

我有一个非常简单的函数来保存 PPM 图像:

void WriteCImage(CImage *cimg, char *filename)
{
    FILE *fp;
    int i,n;

    fp = fopen(filename,"w");
    fprintf(fp,"P6\n");
    fprintf(fp,"%d %d\n",cimg->C[0]->ncols,cimg->C[0]->nrows);
    fprintf(fp,"255\n"); 
    n = cimg->C[0]->ncols*cimg->C[0]->nrows;
    for (i=0; i < n; i++) 
    {
        fputc(cimg->C[0]->val[i],fp);
        fputc(cimg->C[1]->val[i],fp);
        fputc(cimg->C[2]->val[i],fp);
    }
    fclose(fp);
}

如您所见,此函数接收一个矩阵(CImage 格式)并将图像数据写入 ASCII 文件。这似乎是正确的,但每次我将灰度图像复制到 PPM 图像时都会遇到问题。看代码:

//that's a PGM grayscale image
gt = ReadImage(argv[1]);

//creating an RGB image with same dimensions of the PGM image
nwcimg = CreateCImage(gt->nrows,gt->ncols);

n=gt->nrows*gt->ncols;

//iterate through the PGM image
for(index=0;index<n;index++)  
{
    // just a copy of the grayscale image value to all 3 layeres    
    //of the PPM (RGB) image    
    nwcimg->C[0]->val[index]=gt->val[index];
    nwcimg->C[1]->val[index]=gt->val[index];
    nwcimg->C[2]->val[index]=gt->val[index];
}


WriteCImage(nwcimg,"gt-copied.ppm"); 
DestroyCImage(&nwcimg);
DestroyImage(&gt);

我有什么问题?好吧,代码看起来正确而简单。但是当cimage矩阵/向量写成文件时,我可以看到两张图片是不一样的。似乎 PGM 图像的像素在复制的图像中“移位”或“镜像”。

您可以看到图像文件RGB 副本

4

1 回答 1

2

不应该

for(index=0;index<n;index++) {
    nwcimg->C[0]->val[index]=gt->val[index];
    nwcimg->C[1]->val[index]=gt->val[index];
    nwcimg->C[2]->val[index]=gt->val[index];

for(index=0;index<n;index) {
    nwcimg->C[0]->val[index]=gt->val[index++];
    nwcimg->C[1]->val[index]=gt->val[index++];
    nwcimg->C[2]->val[index]=gt->val[index++];

? 文件编写器中的for循环每个循环写入 3 个字节。阅读器中的循环每个循环仅消耗 1 个字节,然后将其复制到三个单独的数组中。

于 2013-11-04T17:12:22.870 回答