2013-08-04 37 views
1

我正在製作一個程序,用C創建一個位圖文件,它使用24位顏色。填充位圖像素數組

我正在寫3個階段的文件,我先寫FileHeader,然後是InfoHeader,然後寫Pixel Data。我無法填充像素數據,因此每行都會在字邊界上結束。

下面的代碼工作有時,但只有沒有while循環(它將填充添加到行的末尾)。例如,對於12x12px的圖像,我可以將其縮放到24x24,但不能縮放到10x10(文件已損壞)。當我在下面填充代碼時,圖像會變形,並且有時也會被破壞。

我似乎無法弄清楚出了什麼問題,下面的代碼應該添加填充到每行的末尾,直到我點擊一個字邊界,然後開始下一行。

fwrite(&fh, 1, sizeof(FILEHEADER), n_img); 
fwrite(&ih, 1, sizeof(INFOHEADER), n_img); 
int i, j; 
uint8_t pad = 0; 
for (i = height-1; i >= 0; i--) { 
    for (j = 0; j < width; j++) 
     fwrite(n_pix+(i*width)+j, 1, sizeof(IMAGE), n_img); 

    while(ftell(n_img)%4 != 0) 
     fwrite(&pad, 1, 1, n_img); 
} 
+0

所以,你不打算把它做成一個像素的平方,而只是在字邊界上完成每一行? – shrm

回答

4

您還沒有填充爲字,你是在填充當前文件中的位置。它不起作用,因爲您的標題大小加起來爲54 - 不是4的倍數。

而不是使用ftell檢索'當前位置',使用數學。讓你的pad一個unsigned long,和你的循環之前插入:

int npad = (sizeof(IMAGE)*width) & 3; 
if (npad) 
    npad = 4-npad; 

然後,而不是while(ftell ..循環,馬上寫出來所需的字節數:

fwrite (&pad, 1,npad, n_img); 

npad將範圍從0。 .3,這就是爲什麼你必須使pad爲4個字節的整數。

+0

哦,所以我應該填充相對於像素數據的開始,而不是相對於文件的開始呢? –

+2

是,根據「計算表面步幅」下的[Microsoft參考](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd318229(v = vs.85).aspx)。 – usr2564301