gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:58:26 25 4
gpt4 key购买 nike

我正在尝试从 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

最佳答案

你必须为了作业而写这个,还是为了乐趣,或者你可以使用别人的代码吗?

有一个开源解决方案。“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 为 <256,因此每个颜色分量的数据为一个字节,则读取三个字节,并调用 3 次 fgetc(fp) 将返回一个 RGB 像素的二进制值。

如果程序读取了 header ,则它具有图像数据的宽度和高度值。因此它可以为每一行分配一个数组(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
// ...

关于c - 使用C读取PPM文件的像素数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com