首页 文章

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

提问于
浏览
0

我试图从PPM文件中读取像素数据 . 我有一个读取 Headers 的功能,所以我知道它指向像素数据的开头 . 我尝试使用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

1 回答

  • 1

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

    有一个开源解决方案 . "Netpbm is a package of graphics programs and a programming library. ",包括在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 <256,因此每个颜色分量的数据是一个字节,那么读取三个字节,三次调用fgetc(fp)将返回一个RGB像素的二进制值 .

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

相关问题