イメージの各ピクセルのRGBカラー値のバイトをbmp(ビットマップ)形式で表示する必要があるコードに問題があります。ビットマップからカラーバイト(RGB)を読み取る
私はWindows APIをより現実的な方法でビットマップで動作させる方法を知っていますが、最終的なコードをオペレーティングシステムの観点から移植したいので、構造体を作成しました。
#include <stdio.h>
#include <stdlib.h>
unsigned char *readBMP(char *filename, int *size) {
int width, height;
unsigned char *data;
unsigned char info[54];
FILE *file = fopen(filename, "rb");
if (file == NULL)
return 0;
fread(info, sizeof(unsigned char), 54, file); // read the 54-byte header
// extract image height and width from header
width = *(int *) &info[18];
height = *(int *) &info[22];
*size = 3 * width * height;
data = (unsigned char *) malloc(*size * sizeof(unsigned char)); // allocate 3 bytes per pixel
fread(data, sizeof(unsigned char), (size_t) *size, file); // read the rest of the data at once
for (int i = 0; i < *size; i += 3) {
unsigned char tmp = data[i];
data[i] = data[i + 2];
data[i + 2] = tmp;
}
fclose(file);
return data;
}
int main() {
int size = 0;
char filename[] = "output.bmp";
unsigned char *data = readBMP(filename, &size);
for (int i = 0; i < size; i++) {
printf("%d. %d\n", i + 1, (int) data[i]);
if ((i + 1) % 3 == 0)
printf("\n");
}
free(data);
return 0;
}
ピクセルのRGBコード:
(0, 0, 0), (0, 0, 255),
(0, 255, 0), (0, 255, 255),
(255, 0, 0), (255, 0, 255);
私は "読み" しようとしている画像は、2×3ピクセルのビットマップである:C.
ここではコードです
そして、私が持っている出力は次のようになります。
1. 255
2. 0
3. 0
4. 255
5. 0
6. 255
7. 0
8. 0
9. 0
10. 255
11. 0
12. 255
13. 0
14. 0
15. 255
16. 0
17. 0
18. 0
最初の測定値であっても、ビットマップの下部にあるピクセルと一致するが、他は、少なくともではないために、他の画素と一致していない彼らが配置されている。
誰かが間違っているのを見ることはできますか?
必要な詰め物を考慮していないようです。各行は4バイトの倍数でなければなりません。 –
ビットマップは、高さが負でない限り、ボトムアップで保存されます。 https://en.wikipedia.org/wiki/BMP_file_format –
2x3イメージを考えると、各行を読み、最後の2バイトを無視する必要があります。これは、その行に4の倍数のバイト数があることを確認するだけでしょうか? –