繁体   English   中英

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

[英]My function is copying a PGM image file to PPM in a different way

我有一个非常简单的功能,可以保存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副本

不能

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个字节,然后将其复制到三个单独的数组中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM