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(>);
私にはどんな問題がありますか?まあ、コードは正しくて単純なようです。しかし、cimage 行列/ベクトルがファイルとして書き込まれると、2 つの画像が同じではないことがわかります。コピーされた画像では、PGM 画像のピクセルが「シフト」または「ミラーリング」されているようです。