libbmp.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /* ************************************************************************* */
  2. /* Organizacion del Computador II */
  3. /* */
  4. /* Biblioteca de funciones para operar imagenes BMP */
  5. /* */
  6. /* Esta biblioteca permite crear, abrir, modificar y guardar archivos en */
  7. /* formato bmp de forma sencilla. Soporta solamente archivos con header de */
  8. /* versiones info_header (40 bytes) y info_v5_header (124 bytes). Para la */
  9. /* primera imagenes de 24 bits (BGR) y la segunda imagenes de 32 (ABGR). */
  10. /* */
  11. /* bmp.h : headers de la biblioteca */
  12. /* bmp.c : codigo fuente de la biblioteca */
  13. /* example.c : ejemplos de uso de la biblioteca */
  14. /* $ gcc example.c bmp.c -o example */
  15. /* ************************************************************************* */
  16. #ifndef __BMP__H__
  17. #define __BMP__H__
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <stdint.h>
  22. #define size_BITMAPCOREHEADER 12
  23. #define size_OS21XBITMAPHEADER 12
  24. #define size_OS22XBITMAPHEADER 64
  25. #define size_BITMAPINFOHEADER 40 // supported
  26. #define size_BITMAPV2INFOHEADER 52
  27. #define size_BITMAPV3INFOHEADER 56
  28. #define size_BITMAPV4HEADER 108
  29. #define size_BITMAPV5HEADER 124 // supported
  30. typedef enum e_BITMAPTYPE {
  31. BITMAPINFOHEADER,
  32. BITMAPV3INFOHEADER,
  33. BITMAPV5HEADER
  34. } BITMAPTYPE;
  35. typedef enum {
  36. LCS_GM_ABS_COLORIMETRIC = 0x00000008,
  37. LCS_GM_BUSINESS = 0x00000001,
  38. LCS_GM_GRAPHICS = 0x00000002,
  39. LCS_GM_IMAGES = 0x00000004
  40. } BMPGamutMappingIntent;
  41. typedef enum {
  42. LCS_CALIBRATED_RGB = 0x00000000,
  43. LCS_sRGB = 0x73524742,
  44. LCS_WINDOWS_COLOR_SPACE = 0x57696E20
  45. } BMPLogicalColorSpace;
  46. typedef enum {
  47. BI_RGB = 0x0000,
  48. BI_RLE8 = 0x0001,
  49. BI_RLE4 = 0x0002,
  50. BI_BITFIELDS = 0x0003,
  51. BI_JPEG = 0x0004,
  52. BI_PNG = 0x0005,
  53. BI_CMYK = 0x000B,
  54. BI_CMYKRLE8 = 0x000C,
  55. BI_CMYKRLE4 = 0x000D
  56. } BMPCompression;
  57. typedef struct __attribute__((packed)) s_CIEXYZ {
  58. uint32_t ciexyzX; // FXPT2DOT30
  59. uint32_t ciexyzY; // FXPT2DOT30
  60. uint32_t ciexyzZ; // FXPT2DOT30
  61. } CIEXYZ,*LPCIEXYZ;
  62. typedef struct __attribute__((packed)) s_CIEXYZTRIPLE {
  63. CIEXYZ ciexyzRed;
  64. CIEXYZ ciexyzGreen;
  65. CIEXYZ ciexyzBlue;
  66. } CIEXYZTRIPLE,*LPCIEXYZTRIPLE;
  67. typedef struct __attribute__((packed)) s_BITMAPFILEHEADER {
  68. char bfType[2];
  69. uint32_t bfSize;
  70. uint16_t bfReserved1;
  71. uint16_t bfReserved2;
  72. uint32_t bfOffBits;
  73. } BMPFH;
  74. typedef struct __attribute__((packed)) s_BITMAPINFOHEADER {
  75. uint32_t biSize;
  76. uint32_t biWidth;
  77. uint32_t biHeight;
  78. uint16_t biPlanes;
  79. uint16_t biBitCount;
  80. uint32_t biCompression;
  81. uint32_t biSizeImage;
  82. uint32_t biXPelsPerMeter;
  83. uint32_t biYPelsPerMeter;
  84. uint32_t biClrUsed;
  85. uint32_t biClrImportant;
  86. } BMPIH;
  87. typedef struct __attribute__((packed)) s_BITMAPV3INFOHEADER {
  88. uint32_t bv3iSize;
  89. uint32_t bv3iWidth;
  90. uint32_t bv3iHeight;
  91. uint16_t bv3iPlanes;
  92. uint16_t bv3iBitCount;
  93. uint32_t bv3iCompression;
  94. uint32_t bv3iSizeImage;
  95. uint32_t bv3iXPelsPerMeter;
  96. uint32_t bv3iYPelsPerMeter;
  97. uint32_t bv3iClrUsed;
  98. uint32_t bv3iClrImportant;
  99. uint32_t bv3iRedMask;
  100. uint32_t bv3iGreenMask;
  101. uint32_t bv3iBlueMask;
  102. uint32_t bv3iAlphaMask;
  103. } BMPV3IH;
  104. typedef struct __attribute__((packed)) s_BITMAPV5HEADER{
  105. uint32_t bV5Size;
  106. uint32_t bV5Width;
  107. uint32_t bV5Height;
  108. uint16_t bV5Planes;
  109. uint16_t bV5BitCount;
  110. uint32_t bV5Compression;
  111. uint32_t bV5SizeImage;
  112. uint32_t bV5XPelsPerMeter;
  113. uint32_t bV5YPelsPerMeter;
  114. uint32_t bV5ClrUsed;
  115. uint32_t bV5ClrImportant;
  116. uint32_t bV5RedMask;
  117. uint32_t bV5GreenMask;
  118. uint32_t bV5BlueMask;
  119. uint32_t bV5AlphaMask;
  120. uint32_t bV5CSType;
  121. CIEXYZTRIPLE bV5Endpoints;
  122. uint32_t bV5GammaRed;
  123. uint32_t bV5GammaGreen;
  124. uint32_t bV5GammaBlue;
  125. uint32_t bV5Intent;
  126. uint32_t bV5ProfileData;
  127. uint32_t bV5ProfileSize;
  128. uint32_t bV5Reserved;
  129. } BMPV5H;
  130. typedef struct s_BMP { BMPFH* fh; void* ih; uint8_t* data; } BMP;
  131. /** get_BMPIH: crea un info header con parametros default**/
  132. BMPIH* get_BMPIH(uint32_t width, uint32_t height);
  133. /** get_BMPV5H: crea un info header v5 con parametros default **/
  134. BMPV5H* get_BMPV5H(uint32_t width, uint32_t height);
  135. /** bmp_create: Crea un bmp usando un headers info (40B or 124B), init_data en 1 incializa data **/
  136. BMP* bmp_create(void* info_header, int init_data);
  137. /** bmp_copy: Copia un bmp, copia data si copy_data es 1 **/
  138. BMP* bmp_copy(BMP* img, int copy_data);
  139. /** bmp_read: Lee un bmp **/
  140. BMP* bmp_read(char* src);
  141. /** bmp_save: Guarda un bmp **/
  142. int bmp_save(char* dst, BMP* img);
  143. /** bmp_delete: Borra un bmp **/
  144. void bmp_delete(BMP* img);
  145. /** bmp_width: obtiene el ancho de un bmp **/
  146. uint32_t bmp_width(BMP* img);
  147. /** bmp_height: obtiene el alto de un bmp **/
  148. uint32_t bmp_height(BMP* img);
  149. /** bmp_bytes_per_row: obtiene el ancho en bytes de cada linea del bmp **/
  150. uint32_t bmp_bytes_per_row(BMP* img);
  151. /** bmp_bitcount: obtiene el bitcount de un bmp **/
  152. uint16_t bmp_bit_count(BMP* img);
  153. /** bmp_compression: obtiene el codigo de compresion **/
  154. uint32_t bmp_compression(BMP* img);
  155. /** bmp_data: obtiene la data de un bmp **/
  156. uint8_t* bmp_data(BMP* img);
  157. /** bmp_convert_24_to_32_bpp: convierte la data del bmp de 24 a 32 bits **/
  158. void bmp_convert_24_to_32_bpp(BMP *img);
  159. #endif /* __BMP__H__ */