0

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

入力として撮った画像は、サイズが27918バイトの114X81でした。最終的な画像のサイズは同じでしたが、サイズは27756バイトでした。

エラーは何でしょうか?

4

2 に答える 2

4

BMP は各行を 4 バイトの倍数で格納します。あなたの場合、それは各行が116バイト(2バイトのパディング)を取ることを意味します。それは 116x78x3+54=27198 を与えるので、あなたは間違っています。

ところで、ヘッダーの長さは必ずしも 54 バイトではありません。

于 2013-01-16T18:35:31.713 に答える
1

各行が 4 バイトの倍数になるように、BMP 画像にはパディングが必要です。

行は 4 の倍数ではないため、行ごとに 2 バイト、つまり合計 162 バイトが不足しています。これがサイズの違いです。

于 2013-01-16T18:36:51.693 に答える