我正在尝试从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;
}
编辑: 起初我以为文件存储为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
答案 0 :(得分:1)
你必须为作业写这篇文章,还是为了愉快,或者你能否使用别人的代码?
有一个开源解决方案。 “Netpbm是一套图形程序和一个编程库。”其中包括在http://netpbm.sourceforge.net/doc/读取PPM的程序
编辑: 你有没有,或阅读文件格式的定义,例如http://netpbm.sourceforge.net/doc/ppm.html?
看起来数据是一个字节RGB三元组的序列,或两个字节RGB三元组的序列。
程序可以从第7项“最大颜色值(Maxval)”中检测使用的格式。它说“如果Maxval小于256,则为1个字节。否则,它是2个字节。”
因此,您编写一个读取一个字节/分量RGB数据的函数,然后编写另一个函数来读取两个字节/分量RGB数据。
程序可以选择在读取Maxval值后调用哪个。
修改{
根据该链接的文档,'P6'ppm的图像数据是二进制的。
因此,如果MaxValue小于&lt; 256,因此每个颜色分量的数据是一个字节,那么读取三个字节,三次调用fgetc(fp)将返回一个RGB像素的二进制值。
如果程序已读取标题,则它具有图像数据的宽度和高度值。因此它可以为每一行(RGB像素的宽度宽度)分配一个数组,并为每个分配的像素行数组分配一个指针数组。然后将二进制数据读入每一行,程序可以直接操作;一个2d阵列。
}结束编辑
我对您的问题的解读表明您已经知道如何使用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
// ...