Advertisement
mayorBanana

Untitled

Oct 31st, 2024
7
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. // Размер заголовка файла в байтах
  8. #define BI_FILE_HEADER_SIZE (14)
  9. // Размер информационного заголовка в байтах
  10. #define BI_INFO_HEADER_SIZE (40)
  11. #define BI_HEIGHT (1080)
  12. #define BI_WEIGHT (1920)
  13.  
  14. // Типы компрессии в BMP файлах
  15. typedef enum bitmap_compression_t
  16. {
  17. // нет компрессиии
  18. BI_RGB = 0,
  19. // RLE 8-bit/pixel
  20. BI_RLE8 = 1,
  21. // RLE 4-bit/pixel
  22. BI_RLE4 = 2,
  23. // OS22XBITMAPHEADER: Huffman 1D
  24. BI_BITFIELDS = 3,
  25. // OS22XBITMAPHEADER: RLE-24
  26. BI_JPEG = 4,
  27. // PNG
  28. BI_PNG = 5,
  29. // RGBA bit field masks
  30. BI_ALPHABITFIELDS = 6,
  31. // BI_CMYK
  32. BI_CMYK = 11,
  33. // BI_CMYKRLE8
  34. BI_CMYKRLE8 = 12,
  35. // BI_CMYKRLE4
  36. BI_CMYKRLE4 = 13,
  37. } bitmap_compression_t;
  38.  
  39.  
  40. #pragma pack(push, 1)
  41. // Заголовок BMP файла
  42. typedef struct bi_file_header_t
  43. {
  44. // "волшебные цифры" определяющие типа файла
  45. // Следует использовать ASCII последовательность "BM"
  46. uint8_t signature[2];
  47. // размер файла в байтах
  48. uint32_t file_size;
  49. // Резерв, должно быть 0
  50. uint16_t reserved[2];
  51. // Адрес массива данных пикселей
  52. uint32_t pixels_offset;
  53. } bi_file_header_t;
  54. #pragma pack(pop)
  55.  
  56.  
  57. #pragma pack(push, 1)
  58. typedef struct bi_info_header_t
  59. {
  60. // размер заголовка. В нашем варианте всегда 40
  61. uint32_t header_size;
  62. // ширина картинки в пикселях
  63. int32_t width;
  64. // высота картинки в пикселях
  65. int32_t height;
  66. // количество "цветовых пространств" ? всегда 1
  67. uint16_t color_panes;
  68. // количетво бит на пиксель
  69. // Обычно 1, 4, 8, 16, 24 или 32.
  70. uint16_t bits_per_pixel;
  71. // алгоритм компрессии (bitmap_compression_t)
  72. uint32_t compression;
  73. // размер массива пикселей картинки (можно 0 для BI_RGB)
  74. uint32_t image_size;
  75. // Горизонтальное разрешение (пикселей на метр)
  76. int32_t horizontal_resolution;
  77. // Вертикальное разрешение (пикселей на метр)
  78. int32_t vertical_resolution;
  79. // Количество цветов в палитре
  80. uint32_t color_table_size;
  81. // Количество важных цветов (проще писать 0)
  82. uint32_t important_colors_count;
  83. } bi_info_header_t;
  84. #pragma pack(pop)
  85.  
  86. typedef struct bi_pixel_rgb_t {
  87. uint8_t B, G, R;
  88. } bi_pixel_rgb_t;
  89.  
  90. int main() {
  91.  
  92. FILE *filework = fopen("test.bmp", "wb");
  93.  
  94. bi_file_header_t bi_file_header = {0};
  95. bi_file_header.signature[0] = 'B';
  96. bi_file_header.signature[1] = 'M';
  97. bi_file_header.file_size = BI_WEIGHT * BI_HEIGHT * 3 + BI_FILE_HEADER_SIZE + BI_INFO_HEADER_SIZE;
  98. bi_file_header.pixels_offset = BI_FILE_HEADER_SIZE + BI_INFO_HEADER_SIZE;
  99. fwrite(&bi_file_header, 1, sizeof(bi_file_header_t), filework);
  100.  
  101. bi_info_header_t bi_info_header = {0};
  102. bi_info_header.header_size = 40;
  103. bi_info_header.width = BI_WEIGHT;
  104. bi_info_header.height = BI_HEIGHT;
  105. bi_info_header.color_panes = 1;
  106. bi_info_header.bits_per_pixel = 24;
  107. fwrite(&bi_info_header, 1, sizeof(bi_info_header_t), filework);
  108.  
  109. size_t length = BI_WEIGHT * BI_HEIGHT;
  110. bi_pixel_rgb_t *bi_pixels_rgb = malloc(length * sizeof(bi_pixel_rgb_t));
  111.  
  112. for (int i = 0; i < BI_WEIGHT; i++) {
  113. for (int j = 0; j < BI_HEIGHT; j++) {
  114. float color = i * 255.0/ BI_WEIGHT;
  115. int index = j * BI_WEIGHT + i;
  116. bi_pixels_rgb[index].B = color;
  117. bi_pixels_rgb[index].G = 0;
  118. bi_pixels_rgb[index].R = 255 - color;
  119. }
  120. }
  121.  
  122.  
  123. fwrite(bi_pixels_rgb, 1, sizeof(bi_pixel_rgb_t) * length, filework);
  124. fclose(filework);
  125.  
  126.  
  127. return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement