使用C读取PPM文件的像素数据

使用C读取PPM文件的像素数据,c,pixel,ppm,C,Pixel,Ppm,我试图从PPM文件中读取像素数据。我有一个函数来读取标题,所以我知道它指向像素数据的开头。我尝试使用fgetc(文件),但如果值超过一位,它将无法工作。我还尝试使用数组并将数组转换为int或char,但我无法知道每个值有多少位数。我也不确定这些值是否用空格分隔。基本上我需要一种方法来提取像素数据。(我用的是C。) 我现在的代码是: char read_byte(FILE *ipt) { int c, i=0, sum=0; while (i<16) { c=

我试图从PPM文件中读取像素数据。我有一个函数来读取标题,所以我知道它指向像素数据的开头。我尝试使用fgetc(文件),但如果值超过一位,它将无法工作。我还尝试使用数组并将数组转换为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;
}
char读取字节(文件*ipt){
int c,i=0,和=0;

而(我你写这篇文章是为了作业,还是为了消遣,还是可以用别人的代码

有一个开源的解决方案。 “Netpbm是一个图形程序包和一个编程库”,其中包括读取PPM的程序

编辑: 您是否了解或阅读了文件格式的定义,例如

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

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

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

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

编辑{

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

所以,如果MaxValue=0&&b>=0){//,那么一切都正常
unsigned int twobyte=(这个答案可能会为您指出正确的方向:我们需要更多的代码。程序是否正确地读取了文件的前8部分,如中所述,如果有,那么它有图像数据的大小、宽度和高度,以及maxvalue,它给出了字节数(1或2)每个颜色成分的。我可以正确读取标题。我正在做一个隐写作业,现在我正在尝试从像素数据中提取信息。我们只需要担心P6和1字节,最大值255。这是一个作业,因此可能最好避免复制代码。请将您的代码添加到您的问题中,并格式化它作为代码,所以我们很容易阅读?很好的缩进有帮助,但不必担心格式问题,只要向我们展示所有代码即可。
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;
}
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
// ...