所以,我正在做一个作业,要求我反化名一张照片但这不是我的问题文件是.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/

10-15 00:17