2015-10-25 34 views
2

所以,我正在努力做一个家庭作业,要求我反照片别名。但这不是我的问题的重点。这些文件是.ppm ppm format。我读了它,使用fread(它是颜色,所以我需要读取rgb)。fwrite()不写整个ppm文件

fread(tmp, 3 * sizeof(char), maxWidth * maxHeight, f) 

其中

tmp = (char *)malloc(width * height * 3 * sizeof(char)); 

我铸TMP到短整型(我需要做对所得矩阵一些工作):

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?也许有人也在为此而努力,并知道如何回答。

+0

你有使用C++的原因吗?我相信Java以更好的方式处理文件流。 – CrakC

+1

@CrakC:这将是翻译整个程序或违反作业要求的一个相当差的理由。 –

+1

@JoachimPileborg:自从'fread'和'fwrite'何时不能用于处理文本文件? –

回答

1

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

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

你只复制图像数据的2 /第三(以及每个字节被复制两次有更多错误的:i递增1个字节和铸件需要两个字节,其中之一是已经复制)。然后在:

for(i=0; i < width * height; i++){ 
    tmp2[i] = (char)values[i]; 
} 

要复制的仅一半values(每个短的第一个字节),或图像的1 /第三。然后在:

fwrite(tmp2, 3 * sizeof(char), width * height, g); 

你写字节的正确安装,但该文件包含图像(和大量的垃圾或零的)的1/3。

我给你解决这个问题。

+0

哦,我明白了。谢谢! :) – Matei