使用C读取PPM文件的像素数据
我试图从PPM文件中读取像素数据。我有一个函数来读取标题,所以我知道它指向像素数据的开头。我尝试使用fgetc(文件),但如果值超过一位,它将无法工作。我还尝试使用数组并将数组转换为int或char,但我无法知道每个值有多少位数。我也不确定这些值是否用空格分隔。基本上我需要一种方法来提取像素数据。(我用的是C。) 我现在的代码是:使用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=
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
// ...