2013-01-16 21 views
0

我試圖將一個bmp圖像克隆到另一個bmp圖像中,但最終圖像無法打開。無法使用c保存圖像文件?

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <process.h> 

void readBMP(char* filename) { 
int i; 
FILE* f = fopen(filename, "rb"); 
FILE* f1= fopen("save.bmp", "wb"); 
if (!f) { 
    printf("Could not read file!\n"); 
    exit(0); 
} 
unsigned char info[54]; 
fread(info, sizeof(unsigned char), 54, f); 
int width = *(int*)&info[18]; 
int height = *(int*)&info[22]; 
printf("%d %d\n", width, height); 

fwrite(info, sizeof(unsigned char), 54, f1); 

int length = width * height; 
unsigned int image[10000][3]; 

for(i = 0; i < length; i++) { 
    image[i][2] = getc(f); 
    image[i][1] = getc(f); 
    image[i][0] = getc(f); 

    putc(image[i][2], f1); 
    putc(image[i][1], f1); 
    putc(image[i][0], f1); 

    printf("pixel %d : [%d,%d,%d]\n", i+1, image[i][0], image[i][1], image[i][2]); 
} 
fclose(f); 
fclose(f1); 
} 
void main() { 
char* fileName = "bitgray.bmp"; 
readBMP(fileName); 
getch(); 
} 

我作爲輸入的圖像是大小爲27918字節的114X81。 最終圖像大小相同,但大小爲27756字節。

什麼可能是錯誤?

+0

你怎麼知道你遇到了錯誤? fopen()失敗了嗎?程序崩潰了嗎? 'save.bmp'文件是否出現在您的目錄中,但無法讀取? – chrisaycock

+0

長度不像寬*高。 – JasonD

+0

您應該檢查文件f1的fopen結果。 – Joze

回答

4

BMP將每行存儲在multiple of 4 bytes中。就你而言,這意味着每行需要116個字節,(2個字節的填充)。這給出116x78x3 + 54 = 27198 所以你做錯了。

順便提一下,標題長度並不總是54字節。

+0

但是我曾經讀過一個24位bmp圖像的頭長度爲54,然後所有的像素值... –

+0

對於大多數24位BMP,你會發現,這是真的。我想這對你的情況已經足夠了。 – leonbloy

+0

我應該使用'unsigned long int'獲取4個字節嗎?或者可能有其他方法來獲得所需的填充? –

1

BMP圖像需要填充,因此每行都是4個字節的倍數。

你的行不是4的倍數,所以你每行缺少2個字節,或總共162個字節 - 這是不同的大小。