所以,我正在做一个作业,要求我反化名一张照片但这不是我的问题文件是.ppmppm format我用fread
(它是彩色的,所以我需要读rgb)。
fread(tmp, 3 * sizeof(char), maxWidth * maxHeight, f)
哪里
tmp = (char *)malloc(width * height * 3 * sizeof(char));
我将tmp转换为short int(我需要对结果矩阵做一些工作):
for(i=0; i < width * height; i++){
values[i] = (short int)tmp[i];
}
值定义为短整数:
values = (short int*) malloc(width * height * sizeof(short int));
问题是我只是想做个测试读取图像,将其转换为
int
,将其转换回char,写入图像在这个阶段,只有1/4的图像是写的,我不知道为什么我阅读了fwrite
的文档,但无法找出我做错了什么将图像转换回(tmp2分配为img):for(i=0; i < width * height; i++){
tmp2[i] = (char)values[i];
}
fwrite(tmp2, 3 * sizeof(char), width * height, g);
我正确使用fwrite了吗也许有人也在挣扎,知道如何回答。
最佳答案
Ashort int
是16位或两个字节在:
for(i=0; i < width * height; i++){
values[i] = (short int)tmp[i];
}
您只复制了图像数据的三分之二(而且当每个字节被复制两次时,还有更多的错误:
i
将以1字节递增,并且转换需要两个字节,其中一个字节已经被复制)然后在:for(i=0; i < width * height; i++){
tmp2[i] = (char)values[i];
}
您只复制了
values
的一半(每个短字符的第一个字节)或图像的1/3然后在:fwrite(tmp2, 3 * sizeof(char), width * height, g);
您正在写入正确的字节数,但该文件只包含图像的1/3(以及大量的垃圾或零)。
我把这个定下来给你。
关于c - fwrite()不能写入整个ppm文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33331728/