fwrite()不写整个ppm文件

时间:2015-10-25 15:57:38

标签: c

所以,我正在努力完成一项功课,要求我对一张照片进行反别名。但这不是我的问题。文件是.ppm ppm 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];
}

值定义为short int:

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吗?也许有人也在努力解决这个问题并知道如何回答。

1 个答案:

答案 0 :(得分:1)

short int是16位或两个字节。在:

for(i=0; i < width * height; i++){
    values[i] = (short int)tmp[i];
}

您只复制了2/3的图像数据(并且每个字节被复制两次时出现更多错误: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(以及大量垃圾或零)。

我把这件事告诉你。