我正试图编写一个PPM文件,并且在头文件方面有问题。
我有一个函数,接受一个文件指针和包含我的头信息的头结构。
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之后仍然没有得到任何信息。在需要的地方,我如何将余下的头文件与所需的空格和换行符一起写入?
发布于 2022-09-01 02:57:51
由于PPM头存储在ascii字符串中,我会这样说:
#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;
}发布于 2022-09-01 02:19:49
如果您查看PPM头示例在维基百科上,您将看到文件中的宽度和高度数字存储为ASCII文本(类似于您如何正确地将数字6作为文本存储在"P6“中)。
但是,在下面的代码中,您似乎在将实际的整数(宽度和高度等)从内存写入文件,这取决于系统的体系结构,与编写表示整数的ASCII字符不一样。在这里,我从我的系统中注释了一个十六进制(具有宽度为5,高度4,maxColor 3的“图像”),其中我的整数被存储在4个字节之间,首先是最不重要的字节:
(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因此,从编程的角度看,您的代码似乎有效,但我认为它并没有达到您的目标。
这可能是您想要的结果:
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. |https://stackoverflow.com/questions/73563477
复制相似问题