Я пытаюсь создать растровое изображение в оттенках серого в C. Проблема заключается в битах на пиксель, если я устанавливаю его на 24 => 3 байта, но он дает мне цветное изображение. Я хочу установить 8 => 1 байт, чтобы он получал полутоновое изображение.Bitmap 8bit Grayscale Image In C
#include<stdio.h>
main() {
char bitmap[1000];
FILE *bp;
// -- FILE HEADER -- //
// bitmap signature
bitmap[0] = 0x42; // B
bitmap[1] = 0x4d; // M
// file size
bitmap[2] = 0x86; // 40 + 14 + 12 (134-66) = 68
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;
// reserved field (in hex. 00 00 00 00)
for (int i = 6; i < 10; i++) bitmap[i] = 0;
bitmap[10] = 54; // 54-36
// offset of pixel data inside the image
for (int i = 11; i < 14; i++) bitmap[i] = 0;
// -- BITMAP HEADER -- //
// header size
bitmap[14] = 0x28; // 40
for (int i = 15; i < 18; i++) bitmap[i] = 0;
// width of the image
bitmap[18] = 4; // 5
for (int i = 19; i < 22; i++) bitmap[i] = 0;
// height of the image
bitmap[22] = 1; // 5
for (int i = 23; i < 26; i++) bitmap[i] = 0;
// reserved field
bitmap[26] = 1;
bitmap[27] = 0;
// number of bits per pixel
bitmap[28] = 24; // 3 byte 24
bitmap[29] = 0;
// compression method (no compression here)
for (int i = 30; i < 34; i++) bitmap[i] = 0;
// size of pixel data
bitmap[34] = 24; // 12 bits => 4 pixels 80
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;
// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0xC4; //48
bitmap[41] = 0x0E; //177
// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0xC4;
bitmap[45] = 0x0E;
// color pallette information
for (int i = 46; i < 48; i++) bitmap[i] = 0;
// color pallette information
for (int i = 48; i < 50; i++) bitmap[i] = 0;
// number of important colors
for (int i = 50; i < 52; i++) bitmap[i] = 0;
// number of important colors
for (int i = 52; i < 54; i++) bitmap[i] = 0;
// -- PIXEL DATA -- //
for (int i = 54; i < 134; i++){
if (i %2 == 0)
bitmap[i] = 0xFF;
else bitmap[i] = 0;
}
/*bitmap[54] =1; bitmap[55] = 1; bitmap[56] = 0;
bitmap[57] = 1; bitmap[58] = 1; bitmap[59] = 0;
bitmap[60] = 1; bitmap[61] = 1; bitmap[62] = 0;
bitmap[63] = 1; bitmap[64] = 1; bitmap[65] = 0;*/
bp = fopen("e://binary.bmp", "wb");
for (int i = 0; i < 134; i++) {
fprintf(bp, "%c", bitmap[i]);
}
fclose(bp);
}
Вы действительно кодируете этот трудный путь. Обычный способ - заполнить структуру BITMAPINFO и записать ее за один раз. –
просто сделайте все цвета (rgb) одинаковыми ... –
Другое дело, как увеличить высоту и ширину изображения! Если я меняю ширину с 4 на любое другое число, изображение не работает с высотой! – ahsanic