我的功能是以不同的方式将PGM图像文件复制到PPM

时间:2013-11-04 17:07:43

标签: c image ppm pgm

我有一个非常简单的功能,可以保存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图像的像素在复制的图像中被“移位”或“镜像”。

您可以看到Image FileThe RGB copy

1 个答案:

答案 0 :(得分: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个字节,然后将其复制到三个单独的数组中。