如何在 C 语言中制作 ppm 文件的黑白图片



嘿,我需要一些代码帮助,我读取了一个 ppm 文件,将颜色更改为黑白,并想将其保存到新文件中。我可以读取文件的标题并将其写入新文件,但我一直在努力更改颜色。我知道我可以用公式获得灰色值:0.299 * 红色分量 + 0.587 * 绿色分量 + 0.114 * 蓝色分量。有谁知道我如何将其编写为代码?

int main(int argc, char **argv)
{   
    FILE *oldFile, *newFile;
    int width, height, max_colour;
    oldFile = fopen("oldpic.ppm","rb"); 
    newFile = fopen("newpic.ppm","wb");
    fscanf (oldFile, "P6n %d %d %d", &width, &height, &max_colour);
    unsigned char *data = malloc(width*height);
    fread(data,1,width*height,oldFile);

   fprintf(newFile, "P6n%d %dn%dn", width, height, max_colour);
  for (int j = 0; j < width; ++j)
  {
    for (int i = 0; i < height; ++i)
    {
       unsigned char color[3];
      color[0] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* red */
      color[1] = 0.299 * ? + 0.587 * ? + 0.114 * ?;  /* green */
      color[2] = 0.299 * ? + 0.587 * ? + 0.114 * ?;  /* blue */
      (void) fwrite(color, 1, 3, newFile);
    }
  }
  (void) fclose(newFile);
   return 0;
} 

你可能想要缩放二进制算术。

此外,即使您可以将输入数据读取到大型数组中,读取它并一次处理一个像素也可能更容易。

以下是您为此重新设计的代码:

int
main(int argc, char **argv)
{
    FILE *oldFile;
    FILE *newFile;
    int width;
    int height;
    int max_colour;
    oldFile = fopen("oldpic.ppm", "rb");
    newFile = fopen("newpic.ppm", "wb");
    fscanf(oldFile, "P6n %d %d %d", &width, &height, &max_colour);
#if 0
    unsigned char *data = malloc(width * height);
    fread(data, 1, width * height, oldFile);
#endif
    fprintf(newFile, "P6n%d %dn%dn", width, height, max_colour);
    for (int j = 0; j < width; ++j) {
        for (int i = 0; i < height; ++i) {
            unsigned char color[3];
            unsigned int grey;
            fread(color, 1, 3, oldFile);
            grey = 0;
            grey += 299u * color[0];  // red
            grey += 586u * color[1];  // green
            grey += 114u * color[2];  // blue
            grey /= 1000;
            color[0] = grey;
            color[1] = grey;
            color[2] = grey;
            fwrite(color, 1, 3, newFile);
        }
    }
    fclose(oldFile);
    fclose(newFile);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新