2015-10-25 73 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