Balaraj Nayak Ответов: 2

Как писать 24 бит формат bmp заголовок высота=480 ширина=752 с использованием языка C


привет всем этот код предназначен для записи изображения высотой 8bpp и шириной, равной 20*20
на самом деле я хочу сделать эту структуру заголовка для 24bpp и height =480 и width=752 может ли кто-нибудь помочь мне сделать это .

#включать
unsigned char bitmap[1300];


пустота BMPmake()
{
int i,noColor=256,end_color=54+4*noColor;
статический unsigned char temp=0;
// -- ЗАГОЛОВОК ФАЙЛА -- //

// растровое изображение подписи
растровое изображение[0] = 'B';
растровое изображение[1] = 'M';

// размер файла
растровое изображение[2] = 0xc6; // 40 + 14 + 256*4+400
растровое изображение[3] = 0x05;
растровое изображение[4] = 0;
растровое изображение[5] = 0;

// зарезервированное поле (в шестнадцатеричном формате. 00 00 00 00)
для( i = 6; i 400 пикселей ,,,, 20x20x1
bitmap[35] = 0x01;//0x190
растровое изображение[36] = 0;
растровое изображение[37] = 0;

// горизонтальное разрешение изображения - пикселы на метр (2835)
растровое изображение[38] = 0;
растровое изображение[39] = 0;
растровое изображение[40] = 0;
растровое изображение[41] = 0;

// вертикальное разрешение изображения - пикселы на метр (2835)
растровое изображение[42] = 0;
растровое изображение[43] = 0;
растровое изображение[44] = 0;
растровое изображение[45] = 0;

// информация о цветовой палитре здесь 256
растровое изображение[46]=0;
растровое изображение[47]=1;
для( i = 48; i < 50; i++) растрового изображения[i] = 0;

// количество важных цветов
// если 0, то важны все цвета
для( i = 50; i < 54; i++) растрового изображения[i] = 0;

//цветовая палитра
//для менее чем 8-битного BMP-изображения мы должны создать цветовую палитру размером 4*noofcolor, которая является ничем иным, как
//[Синий][зеленый][красный][нулевые] значения
//для 8 бит мы имеем следующий код
для (i=54;i<end_color;i+=4)
{
растровое изображение[я]=темп;
растровое изображение[i+1]=temp;
растровое изображение[i+2]=temp;
растровое изображение[i+3]=0;
температура++;
}

// -- ПИКСЕЛЬНЫЕ ДАННЫЕ -- //
Для( я = end_color; я &л; end_color+400; я++) растрового изображения[Я] = значение 0xFF;
}

пустота BMPwrite()
{
Файл *файл;
int i;

//используйте wb+ при записи в двоичный файл, то есть в двоичной форме, тогда как w+ для txt-файла.
file = fopen("b.bmp", "wb+");
для( i = 0; i < 1478; i++)
{
fputc(bitmap[i], файл);
}
fclose(файл);
}
пустота главная()
{

BMPmake();
BMPwrite();
printf("готово!!");
}

Что я уже пробовал:

я попробовал, как показано ниже кода
 #include
   unsigned char bitmap[1300];


void BMPmake()
{
    int i,noColor=256,end_color=54+4*noColor;
    static unsigned char temp=0;
    // -- FILE HEADER -- //

    // bitmap signature
    bitmap[0] = 'B';
    bitmap[1] = 'M';

    // file size
    bitmap[2] = 0xc6; // 40 + 14 + 256*4+400
    bitmap[3] = 0x05;
    bitmap[4] = 0;
    bitmap[5] = 0;

    // reserved field (in hex. 00 00 00 00)
    for( i = 6; i  400 pixels ,,,, 20x20x1
    bitmap[35] = 0x01;//0x190
    bitmap[36] = 0;
    bitmap[37] = 0;

    // horizontal resolution of the image - pixels per meter (2835)
    bitmap[38] = 0;
    bitmap[39] = 0;
    bitmap[40] = 0;
    bitmap[41] = 0;

    // vertical resolution of the image - pixels per meter (2835)
    bitmap[42] = 0;
    bitmap[43] = 0;
    bitmap[44] = 0;
    bitmap[45] = 0;

    // color palette information here 256
    bitmap[46]=0;
    bitmap[47]=1;
    for( i = 48; i < 50; i++) bitmap[i] = 0;

    // number of important colors
    // if 0 then all colors are important
    for( i = 50; i < 54; i++) bitmap[i] = 0;

    //Color Palette
    //for less then or equal to 8 bit BMP Image we have to create a 4*noofcolor size color palette which is nothing but
    //[BLUE][GREEN][RED][ZERO] values
    //for 8 bit we have the following code
    for (i=54;i<end_color;i+=4)
    {
        bitmap[i]=temp;
        bitmap[i+1]=temp;
        bitmap[i+2]=temp;
        bitmap[i+3]=0;
        temp++;
    }

    // -- PIXEL DATA -- //
    for( i = end_color; i < end_color+400; i++) bitmap[i] = 0xff;
}

void BMPwrite()
{
    FILE *file;
    int i;

    //use wb+ when writing to binary file .i.e. in binary form whereas w+ for txt file.
    file = fopen("b.bmp", "wb+");
    for( i = 0; i < 1478; i++)
    {
        fputc(bitmap[i], file);
    }
    fclose(file);
}
void main()
{

    BMPmake();
    BMPwrite();
    printf("Done!!");
}

2 Ответов

Рейтинг:
2

Richard MacCutchan

Видеть Растровые Изображения (Windows)[^].


Balaraj Nayak

я вижу это, но я не понимаю, где именно я должен проверить и изменить значения

Рейтинг:
17

Jochen Arndt

Используйте структуры вместо массива байтов:
Структура BITMAPFILEHEADER (Windows)[^]
Структура BITMAPINFO (Windows)[^]
Структура BITMAPINFOHEADER (Windows)[^]

Определите переменные для этих структур, инициализируйте их и запишите в файл, за которым следуют данные растровых пикселей. Обратите внимание, что нет цветной таблицы с 24 БПП (biClrUsed быть нулевой).

BITMAPFILEHEADER fh;
BITMAPINFOHEADER fi;

unsigned width = 752;
unsigned height = 480;
// 32-bit aligned
unsigned widthBytes = ((width * 24 + 31) & ~31) / 8;
unsigned bppSize = widthBytes * height;

fh.bfType = 0x4D42; // "BM"
fh.bfSize = sizeof(fh) + sizeof(fi) + bppSize;
fh.bfReserved1 = fh.bfReserved2 = 0;
fh.bfOffBits = sizeof(fh) + sizeof(fi);

fi.biSize = sizeof(fi);
fi.biWidth = width;
fi.biHeight = height;
fi.biPlanes = 1;
fi.biBitCount = 24;
fi.biCompression = BI_RGB; // BI_RGB is 0
fi.biSizeImage = bppSize;
fi.biXPelsPerMeter = fi.biYPelsPerMeter = 0;
fi.biClrUsed = 0;
fi.biClrImportant = 0;

fwrite(&fh, sizeof(fh), 1, file);
fwrite(&fi, sizeof(fi), 1, file);
// write bitmap data here


Balaraj Nayak

Хорошо я понял вас но можете ли вы сказать мне в приведенных выше изменениях кода потому что на самом деле я пишу код стороны платы выше один строит seccessfull но только ширина и высота не приходят пожалуйста проверьте этот код один раз если есть какие либо изменения помогите мне это будет полезно для меня

Jochen Arndt

В моем коде ширина и высота поменялись местами. Я его обновлю.

Balaraj Nayak

пожалуйста, попробуйте изменить мой код или дайте мне полный исходный код ur, который может записывать raw в bmp или rgb в bmp на языке c

Balaraj Nayak

можете ли вы теперь обновить свой код или изменить мой код??

Balaraj Nayak

пожалуйста, попробуйте изменить мой код или дайте мне полный исходный код ur, который может записывать raw в bmp или rgb в bmp на языке c

Jochen Arndt

Просто используйте мой код в своей функции BMPwrite (). Все, что вам потребуется, это добавить записи данных в формате BMP пикселей :
fwrite(pixel_data, 1, bppSize, file);

Balaraj Nayak

можете ли вы plz скопировать вставить wt я должен сделать я в замешательстве

Jochen Arndt

Вы должны скопировать и вставить код из моего решения в свою функцию BMPwrite() и добавить строку из моего предыдущего комментария. Я не могу сделать больше, потому что я не знаю о ваших растровых данных.

Вы также должны быть в состоянии адаптировать такие фрагменты кода к вашим потребностям. Он просто использует две структуры и инициализирует их в соответствии с документацией по моим ссылкам.