首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写PPM文件头

编写PPM文件头
EN

Stack Overflow用户
提问于 2022-09-01 01:35:51
回答 2查看 47关注 0票数 0

我正试图编写一个PPM文件,并且在头文件方面有问题。

我有一个函数,接受一个文件指针和包含我的头信息的头结构。

代码语言:javascript
复制
void writeHeader(FILE* file, struct Header* header){
    char space[] = " ";
    char newLine[] = "\n";

    fwrite(&header->magicNum[0], sizeof(char), 1, file);
    fwrite(&header->magicNum[1], sizeof(char), 1, file);
    fwrite(newLine, sizeof(char), 1, file);

    fwrite(&(header->width), sizeof(int), 1, file);
    fwrite(space, sizeof(char), 1, file);
    fwrite(&header->height, sizeof(int), 1, file);
    fwrite(newLine, sizeof(char), 1, file);

    fwrite(&header->maxColor, sizeof(int), 1, file);
    fwrite(newLine, sizeof(char), 1, file);
    fwrite(space, sizeof(char), 1, file);
}

当我调用它时,我只会将前两个值"P6“写入文件,然后在后面空白(或十六进制编辑器中的点)。我也尝试过删除空格和换行符,但在P6之后仍然没有得到任何信息。在需要的地方,我如何将余下的头文件与所需的空格和换行符一起写入?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-01 02:57:51

由于PPM头存储在ascii字符串中,我会这样说:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

#define OUTFILE "file.ppm"

struct Header {
    char magicNum[3];
    int width;
    int height;
    int maxColor;
};

void writeHeader(FILE* file, struct Header* header)
{
    fprintf(file, "%s\n", header->magicNum);
    fprintf(file, "%d %d\n", header->width, header->height);
    fprintf(file, "%d\n", header->maxColor);
}

int main()
{
    struct Header header;
    FILE *fp;

    strcpy(header.magicNum, "P6");
    header.width = 1920;
    header.height = 1080;
    header.maxColor = 255;

    fp = fopen(OUTFILE, "w");
    if (fp == NULL) {
        perror(OUTFILE);
        exit(1);
    }
    writeHeader(fp, &header);

    // write the ppm data to the file

    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2022-09-01 02:19:49

如果您查看PPM头示例在维基百科上,您将看到文件中的宽度和高度数字存储为ASCII文本(类似于您如何正确地将数字6作为文本存储在"P6“中)。

但是,在下面的代码中,您似乎在将实际的整数(宽度和高度等)从内存写入文件,这取决于系统的体系结构,与编写表示整数的ASCII字符不一样。在这里,我从我的系统中注释了一个十六进制(具有宽度为5,高度4,maxColor 3的“图像”),其中我的整数被存储在4个字节之间,首先是最不重要的字节:

代码语言:javascript
复制
(ch = character; sp = space)
          ch ch ch --integer-- ch  --integer-- ch --intege
          P  6  \n |width:5--| sp  |height:4-| \n |maxCol:
00000000  50 36 0a 05 00 00 00 20  04 00 00 00 0a 03 00 00  |P6..... ........|
00000010  00 0a 20                                          |.. |
          3| \n sp
          r- ch ch

因此,从编程的角度看,您的代码似乎有效,但我认为它并没有达到您的目标。

这可能是您想要的结果:

代码语言:javascript
复制
          ch ch ch ch ch ch ch ch  ch ch
          P  6  \n 5  sp 4  \n 3   \n sp
00000000  50 36 0a 35 20 34 0a 33  0a 20                    |P6.5 4.3. |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73563477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档