无法使用c保存图像文件?

时间:2013-01-16 18:26:29

标签: c image-processing bmp

我尝试将bmp图像克隆到另一个bmp图像中,但最终图像无法打开。

#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();
}

我作为输入的图像是114X81,大小为27918字节。 最终图像大小相同,但大小为27756字节。

可能是什么错误?

2 个答案:

答案 0 :(得分:4)

BMP将每一行存储在multiple of 4 bytes中。在您的情况下,这意味着每行占用116个字节(2个字节填充)。这给出了116x78x3 + 54 = 27198  所以你做错了。

BTW标头长度并不总是54个字节。

答案 1 :(得分:1)

BMP图像需要填充,因此每行是4个字节的倍数。

你的行不是4的倍数,所以你每行丢失2个字节,或总共162个字节 - 这是大小的差异。