| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /* ************************************************************************* */
- /* Organizacion del Computador II */
- /* */
- /* Biblioteca de funciones para operar imagenes BMP */
- /* */
- /* Esta biblioteca permite crear, abrir, modificar y guardar archivos en */
- /* formato bmp de forma sencilla. Soporta solamente archivos con header de */
- /* versiones info_header (40 bytes) y info_v5_header (124 bytes). Para la */
- /* primera imagenes de 24 bits (BGR) y la segunda imagenes de 32 (ABGR). */
- /* */
- /* bmp.h : headers de la biblioteca */
- /* bmp.c : codigo fuente de la biblioteca */
- /* example.c : ejemplos de uso de la biblioteca */
- /* $ gcc example.c bmp.c -o example */
- /* ************************************************************************* */
- #ifndef __BMP__H__
- #define __BMP__H__
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdint.h>
- #define size_BITMAPCOREHEADER 12
- #define size_OS21XBITMAPHEADER 12
- #define size_OS22XBITMAPHEADER 64
- #define size_BITMAPINFOHEADER 40 // supported
- #define size_BITMAPV2INFOHEADER 52
- #define size_BITMAPV3INFOHEADER 56
- #define size_BITMAPV4HEADER 108
- #define size_BITMAPV5HEADER 124 // supported
- typedef enum e_BITMAPTYPE {
- BITMAPINFOHEADER,
- BITMAPV3INFOHEADER,
- BITMAPV5HEADER
- } BITMAPTYPE;
- typedef enum {
- LCS_GM_ABS_COLORIMETRIC = 0x00000008,
- LCS_GM_BUSINESS = 0x00000001,
- LCS_GM_GRAPHICS = 0x00000002,
- LCS_GM_IMAGES = 0x00000004
- } BMPGamutMappingIntent;
- typedef enum {
- LCS_CALIBRATED_RGB = 0x00000000,
- LCS_sRGB = 0x73524742,
- LCS_WINDOWS_COLOR_SPACE = 0x57696E20
- } BMPLogicalColorSpace;
- typedef enum {
- BI_RGB = 0x0000,
- BI_RLE8 = 0x0001,
- BI_RLE4 = 0x0002,
- BI_BITFIELDS = 0x0003,
- BI_JPEG = 0x0004,
- BI_PNG = 0x0005,
- BI_CMYK = 0x000B,
- BI_CMYKRLE8 = 0x000C,
- BI_CMYKRLE4 = 0x000D
- } BMPCompression;
- typedef struct __attribute__((packed)) s_CIEXYZ {
- uint32_t ciexyzX; // FXPT2DOT30
- uint32_t ciexyzY; // FXPT2DOT30
- uint32_t ciexyzZ; // FXPT2DOT30
- } CIEXYZ,*LPCIEXYZ;
- typedef struct __attribute__((packed)) s_CIEXYZTRIPLE {
- CIEXYZ ciexyzRed;
- CIEXYZ ciexyzGreen;
- CIEXYZ ciexyzBlue;
- } CIEXYZTRIPLE,*LPCIEXYZTRIPLE;
- typedef struct __attribute__((packed)) s_BITMAPFILEHEADER {
- char bfType[2];
- uint32_t bfSize;
- uint16_t bfReserved1;
- uint16_t bfReserved2;
- uint32_t bfOffBits;
- } BMPFH;
- typedef struct __attribute__((packed)) s_BITMAPINFOHEADER {
- uint32_t biSize;
- uint32_t biWidth;
- uint32_t biHeight;
- uint16_t biPlanes;
- uint16_t biBitCount;
- uint32_t biCompression;
- uint32_t biSizeImage;
- uint32_t biXPelsPerMeter;
- uint32_t biYPelsPerMeter;
- uint32_t biClrUsed;
- uint32_t biClrImportant;
- } BMPIH;
- typedef struct __attribute__((packed)) s_BITMAPV3INFOHEADER {
- uint32_t bv3iSize;
- uint32_t bv3iWidth;
- uint32_t bv3iHeight;
- uint16_t bv3iPlanes;
- uint16_t bv3iBitCount;
- uint32_t bv3iCompression;
- uint32_t bv3iSizeImage;
- uint32_t bv3iXPelsPerMeter;
- uint32_t bv3iYPelsPerMeter;
- uint32_t bv3iClrUsed;
- uint32_t bv3iClrImportant;
- uint32_t bv3iRedMask;
- uint32_t bv3iGreenMask;
- uint32_t bv3iBlueMask;
- uint32_t bv3iAlphaMask;
- } BMPV3IH;
- typedef struct __attribute__((packed)) s_BITMAPV5HEADER{
- uint32_t bV5Size;
- uint32_t bV5Width;
- uint32_t bV5Height;
- uint16_t bV5Planes;
- uint16_t bV5BitCount;
- uint32_t bV5Compression;
- uint32_t bV5SizeImage;
- uint32_t bV5XPelsPerMeter;
- uint32_t bV5YPelsPerMeter;
- uint32_t bV5ClrUsed;
- uint32_t bV5ClrImportant;
- uint32_t bV5RedMask;
- uint32_t bV5GreenMask;
- uint32_t bV5BlueMask;
- uint32_t bV5AlphaMask;
- uint32_t bV5CSType;
- CIEXYZTRIPLE bV5Endpoints;
- uint32_t bV5GammaRed;
- uint32_t bV5GammaGreen;
- uint32_t bV5GammaBlue;
- uint32_t bV5Intent;
- uint32_t bV5ProfileData;
- uint32_t bV5ProfileSize;
- uint32_t bV5Reserved;
- } BMPV5H;
- typedef struct s_BMP { BMPFH* fh; void* ih; uint8_t* data; } BMP;
- /** get_BMPIH: crea un info header con parametros default**/
- BMPIH* get_BMPIH(uint32_t width, uint32_t height);
- /** get_BMPV5H: crea un info header v5 con parametros default **/
- BMPV5H* get_BMPV5H(uint32_t width, uint32_t height);
- /** bmp_create: Crea un bmp usando un headers info (40B or 124B), init_data en 1 incializa data **/
- BMP* bmp_create(void* info_header, int init_data);
- /** bmp_copy: Copia un bmp, copia data si copy_data es 1 **/
- BMP* bmp_copy(BMP* img, int copy_data);
- /** bmp_read: Lee un bmp **/
- BMP* bmp_read(char* src);
- /** bmp_save: Guarda un bmp **/
- int bmp_save(char* dst, BMP* img);
- /** bmp_delete: Borra un bmp **/
- void bmp_delete(BMP* img);
- /** bmp_width: obtiene el ancho de un bmp **/
- uint32_t bmp_width(BMP* img);
- /** bmp_height: obtiene el alto de un bmp **/
- uint32_t bmp_height(BMP* img);
- /** bmp_bytes_per_row: obtiene el ancho en bytes de cada linea del bmp **/
- uint32_t bmp_bytes_per_row(BMP* img);
- /** bmp_bitcount: obtiene el bitcount de un bmp **/
- uint16_t bmp_bit_count(BMP* img);
- /** bmp_compression: obtiene el codigo de compresion **/
- uint32_t bmp_compression(BMP* img);
- /** bmp_data: obtiene la data de un bmp **/
- uint8_t* bmp_data(BMP* img);
- /** bmp_convert_24_to_32_bpp: convierte la data del bmp de 24 a 32 bits **/
- void bmp_convert_24_to_32_bpp(BMP *img);
- #endif /* __BMP__H__ */
|