【问题标题】:fwrite() not writing entire ppm filefwrite() 没有写入整个 ppm 文件
【发布时间】:2015-10-25 15:57:37
【问题描述】:

所以,我正在努力完成一项要求我对照片进行抗锯齿处理的作业。但这不是我的问题的重点。这些文件是 .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];
}

values 被定义为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 是否正确?也许有人也为此苦苦挣扎并且知道如何回答。

【问题讨论】:

  • 你使用 c++ 有什么原因吗?我相信 Java 以更好的方式处理文件流。
  • @CrakC:那将是翻译整个程序或违反作业要求的一个非常糟糕的理由。
  • @JoachimPileborg:从什么时候开始freadfwrite 不能用于处理文本文件?
  • @JoachimPileborg 如果是 P6 格式,则为二进制。
  • 您只在tmp2 中填写了width * height 字节,但您正在从中写入3 * width * height 字节。

标签: c


【解决方案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(以及大量垃圾或零)。

这个问题交给你解决。

【讨论】:

  • 哦,我明白了。谢谢! :)
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多