【问题标题】:Reading pixel data of a PPM file using C使用 C 读取 PPM 文件的像素数据
【发布时间】:2012-03-18 00:21:14
【问题描述】:

我正在尝试从 PPM 文件中读取像素数据。我有一个读取标题的功能,所以我知道它指向像素数据的开头。我尝试使用 fgetc(file) 但如果该值超过一位,它将不起作用。我还尝试使用数组并将数组转换为 int 或 char,但我无法知道每个值有多少位数。我也不确定这些值是否由空格分隔。基本上我需要一种方法来提取像素数据。 (我正在使用 C。)

我现在的代码是:

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while (i<16) {
        c=fgetc(ipt);
        if((i%2)!=0 {
            if(c&1) {
                sum+=pow(2,i/2);
            }
        }
        i++;
    }
    return (char)sum;
}

编辑: 起初我以为文件存储为 ASCII 值,然后我意识到它存储为二进制。现在我想我让它像十六进制一样。我不确定这是否正确。我真的被困住了。

编辑:稍微更改了我的代码

char read_byte(FILE *ipt) {
    int c, i=0, sum=0;
    while(i<8) {
        c = fgetc(ipt);
        c=c&1;
        sum+=c*pow(2,i);
        i++;
    }
    return sum;
}

我将总和打印为 %c

【问题讨论】:

  • 这个答案可能会为您指明正确的方向:stackoverflow.com/questions/2693631/…
  • 我们需要更多代码。程序是否正确读取了文件的所有前 8 部分,如netpbm.sourceforge.net/doc/ppm.html 所述,如果有,则它具有图像数据的大小、宽度和高度,以及给出字节数的最大值(每个颜色分量的 1 或 2) 个。
  • 我可以正确读取标题。我正在做一个隐写术作业,现在我正试图从像素数据中提取信息。我们只需要担心 P6 和 1 字节,最大值 255。

标签: c pixel ppm


【解决方案1】:

您是否必须为作业编写此代码,或者是为了娱乐,还是您可以使用其他人的代码?

有一个开源解决方案。 “Netpbm 是一个图形程序包和一个编程库。”其中包括读取 PPM 的程序http://netpbm.sourceforge.net/doc/

编辑: 您是否获得或阅读了文件格式的定义,例如http://netpbm.sourceforge.net/doc/ppm.html?

看起来数据要么是一字节 RGB 三元组的序列,要么是两字节 RGB 三元组的序列。

程序可以从第7项“最大颜色值(Maxval)”中检测出使用了哪种格式。它说“如果 Maxval 小于 256,则为 1 个字节。否则,为 2 个字节。”

因此,您编写了一个读取一个字节/分量 RGB 数据的函数,然后编写另一个函数来读取两个字节/分量 RGB 数据。

程序可以在读取 Maxval 的值后选择调用哪个。

编辑 {

根据该链接上的文档,“P6”ppm 中的图像数据是二进制的。

因此,如果 MaxValue

如果程序已读取标题,则它具有图像数据的宽度和高度值。因此它可以为每一行分配一个数组(宽度为 RGB 像素),并为每个分配的像素行数组分配一个指针数组。然后将二进制数据读入每一行,程序就可以直接操作了;一个二维数组。

}结束编辑

我对您的问题的阅读表明您已经知道如何使用 fgetc 读取一个字节数据。

编辑 - 这似乎无关紧要: 您可以通过调用 fgetc 两次来读取两个字节数据,并对数据进行移位和位或运算,例如(部分忽略错误检查):

int a = fgetc(fp);
int b = fgetc(fp);
if (a >= 0 && b >= 0) { // then all is okay
    unsigned int twobyte = (a<<8) | b; // or (b<<8) | a; depending on byte order
// ...

【讨论】:

  • 这是一个作业,所以最好避免复制代码。
  • 能否将您的代码添加到您的问题中,并将其格式化为代码以便我们阅读?
  • 很好的缩进有帮助,但不要担心格式,就像向我们展示所有代码一样。
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多