Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdint.h>
- #include <stdlib.h>
- // Размер заголовка файла в байтах
- #define BI_FILE_HEADER_SIZE (14)
- // Размер информационного заголовка в байтах
- #define BI_INFO_HEADER_SIZE (40)
- #define BI_HEIGHT (1080)
- #define BI_WEIGHT (1920)
- // Типы компрессии в BMP файлах
- typedef enum bitmap_compression_t
- {
- // нет компрессиии
- BI_RGB = 0,
- // RLE 8-bit/pixel
- BI_RLE8 = 1,
- // RLE 4-bit/pixel
- BI_RLE4 = 2,
- // OS22XBITMAPHEADER: Huffman 1D
- BI_BITFIELDS = 3,
- // OS22XBITMAPHEADER: RLE-24
- BI_JPEG = 4,
- // PNG
- BI_PNG = 5,
- // RGBA bit field masks
- BI_ALPHABITFIELDS = 6,
- // BI_CMYK
- BI_CMYK = 11,
- // BI_CMYKRLE8
- BI_CMYKRLE8 = 12,
- // BI_CMYKRLE4
- BI_CMYKRLE4 = 13,
- } bitmap_compression_t;
- #pragma pack(push, 1)
- // Заголовок BMP файла
- typedef struct bi_file_header_t
- {
- // "волшебные цифры" определяющие типа файла
- // Следует использовать ASCII последовательность "BM"
- uint8_t signature[2];
- // размер файла в байтах
- uint32_t file_size;
- // Резерв, должно быть 0
- uint16_t reserved[2];
- // Адрес массива данных пикселей
- uint32_t pixels_offset;
- } bi_file_header_t;
- #pragma pack(pop)
- #pragma pack(push, 1)
- typedef struct bi_info_header_t
- {
- // размер заголовка. В нашем варианте всегда 40
- uint32_t header_size;
- // ширина картинки в пикселях
- int32_t width;
- // высота картинки в пикселях
- int32_t height;
- // количество "цветовых пространств" ? всегда 1
- uint16_t color_panes;
- // количетво бит на пиксель
- // Обычно 1, 4, 8, 16, 24 или 32.
- uint16_t bits_per_pixel;
- // алгоритм компрессии (bitmap_compression_t)
- uint32_t compression;
- // размер массива пикселей картинки (можно 0 для BI_RGB)
- uint32_t image_size;
- // Горизонтальное разрешение (пикселей на метр)
- int32_t horizontal_resolution;
- // Вертикальное разрешение (пикселей на метр)
- int32_t vertical_resolution;
- // Количество цветов в палитре
- uint32_t color_table_size;
- // Количество важных цветов (проще писать 0)
- uint32_t important_colors_count;
- } bi_info_header_t;
- #pragma pack(pop)
- typedef struct bi_pixel_rgb_t {
- uint8_t B, G, R;
- } bi_pixel_rgb_t;
- int main() {
- FILE *filework = fopen("test.bmp", "wb");
- bi_file_header_t bi_file_header = {0};
- bi_file_header.signature[0] = 'B';
- bi_file_header.signature[1] = 'M';
- bi_file_header.file_size = BI_WEIGHT * BI_HEIGHT * 3 + BI_FILE_HEADER_SIZE + BI_INFO_HEADER_SIZE;
- bi_file_header.pixels_offset = BI_FILE_HEADER_SIZE + BI_INFO_HEADER_SIZE;
- fwrite(&bi_file_header, 1, sizeof(bi_file_header_t), filework);
- bi_info_header_t bi_info_header = {0};
- bi_info_header.header_size = 40;
- bi_info_header.width = BI_WEIGHT;
- bi_info_header.height = BI_HEIGHT;
- bi_info_header.color_panes = 1;
- bi_info_header.bits_per_pixel = 24;
- fwrite(&bi_info_header, 1, sizeof(bi_info_header_t), filework);
- size_t length = BI_WEIGHT * BI_HEIGHT;
- bi_pixel_rgb_t *bi_pixels_rgb = malloc(length * sizeof(bi_pixel_rgb_t));
- for (int i = 0; i < BI_WEIGHT; i++) {
- for (int j = 0; j < BI_HEIGHT; j++) {
- float color = i * 255.0/ BI_WEIGHT;
- int index = j * BI_WEIGHT + i;
- bi_pixels_rgb[index].B = color;
- bi_pixels_rgb[index].G = 0;
- bi_pixels_rgb[index].R = 255 - color;
- }
- }
- fwrite(bi_pixels_rgb, 1, sizeof(bi_pixel_rgb_t) * length, filework);
- fclose(filework);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement