#include #include #include #include #include #include "bmp.h" typedef struct { uint16_t file_type; // File type always BM which is 0x4D42 uint32_t file_size; // Size of the file (in bytes) uint16_t reserved1; // Reserved, always 0 uint16_t reserved2; // Reserved, always 0 uint32_t offset_data; // Start position of pixel data (bytes from the beginning of the file) } BMPFileHeader_ts; typedef struct { uint32_t size; // Size of this header (in bytes) int32_t width; // width of bitmap in pixels int32_t height; // width of bitmap in pixels // (if positive, bottom-up, with origin in lower left corner) // (if negative, top-down, with origin in upper left corner) uint16_t planes; // No. of planes for the target device, this is always 1 uint16_t bit_count; // No. of bits per pixel uint32_t compression; // 0 or 3 - uncompressed. THIS PROGRAM CONSIDERS ONLY UNCOMPRESSED BMP images uint32_t size_image; // 0 - for uncompressed images int32_t x_pixels_per_meter; int32_t y_pixels_per_meter; uint32_t colors_used; // No. color indexes in the color table. Use 0 for the max number of colors allowed by bit_count uint32_t colors_important; // No. of colors used for displaying the bitmap. If 0 all colors are required } BMPInfoHeader_ts; typedef struct { uint8_t red; uint8_t green; uint8_t blue; } BMPColorData_ts; typedef struct { BMPFileHeader_ts fileHeader_s; BMPInfoHeader_ts infoHeader_s; BMPColorData_ts colorData_sa[2][3]; } BMPData_ts; BMPData_ts bmpData_s; void read_file(const char *path) { printf("Read file DREIECK.BMP\n"); FILE *imageFile = fopen(path, "rb"); if (imageFile == NULL) { printf("Failed to open file for reading\n"); return; } fread(&bmpData_s.fileHeader_s.file_type, sizeof(bmpData_s.fileHeader_s.file_type), 1, imageFile); fread(&bmpData_s.fileHeader_s.file_size, sizeof(bmpData_s.fileHeader_s.file_size), 1, imageFile); fread(&bmpData_s.fileHeader_s.reserved1, sizeof(bmpData_s.fileHeader_s.reserved1), 1, imageFile); fread(&bmpData_s.fileHeader_s.reserved2, sizeof(bmpData_s.fileHeader_s.reserved2), 1, imageFile); fread(&bmpData_s.fileHeader_s.offset_data, sizeof(bmpData_s.fileHeader_s.offset_data), 1, imageFile); printf("FileHeader.file_type (%c%c). \n", (bmpData_s.fileHeader_s.file_type & 0xFF), ((bmpData_s.fileHeader_s.file_type >> 8) & 0xFF)); printf("FileHeader.file_size (%lu). \n", bmpData_s.fileHeader_s.file_size); printf("FileHeader.offset_data (%lu). \n", bmpData_s.fileHeader_s.offset_data); fread(&bmpData_s.infoHeader_s.size, sizeof(bmpData_s.infoHeader_s.size), 1, imageFile); fread(&bmpData_s.infoHeader_s.width, sizeof(bmpData_s.infoHeader_s.width), 1, imageFile); fread(&bmpData_s.infoHeader_s.height, sizeof(bmpData_s.infoHeader_s.height), 1, imageFile); fread(&bmpData_s.infoHeader_s.planes, sizeof(bmpData_s.infoHeader_s.planes), 1, imageFile); fread(&bmpData_s.infoHeader_s.bit_count, sizeof(bmpData_s.infoHeader_s.bit_count), 1, imageFile); fread(&bmpData_s.infoHeader_s.compression, sizeof(bmpData_s.infoHeader_s.compression), 1, imageFile); fread(&bmpData_s.infoHeader_s.size_image, sizeof(bmpData_s.infoHeader_s.size_image), 1, imageFile); fread(&bmpData_s.infoHeader_s.x_pixels_per_meter, sizeof(bmpData_s.infoHeader_s.x_pixels_per_meter), 1, imageFile); fread(&bmpData_s.infoHeader_s.y_pixels_per_meter, sizeof(bmpData_s.infoHeader_s.y_pixels_per_meter), 1, imageFile); fread(&bmpData_s.infoHeader_s.colors_used, sizeof(bmpData_s.infoHeader_s.colors_used), 1, imageFile); fread(&bmpData_s.infoHeader_s.colors_important, sizeof(bmpData_s.infoHeader_s.colors_important), 1, imageFile); printf("FileHeader.size (%lu). \n", bmpData_s.infoHeader_s.size); printf("FileHeader.width (%ld). \n", bmpData_s.infoHeader_s.width); printf("FileHeader.height (%ld). \n", bmpData_s.infoHeader_s.height); printf("FileHeader.planes (%u). \n", bmpData_s.infoHeader_s.planes); printf("FileHeader.bit_count (%u). \n", bmpData_s.infoHeader_s.bit_count); printf("FileHeader.compression (%lu). \n", bmpData_s.infoHeader_s.compression); printf("FileHeader.size_image (%lu). \n", bmpData_s.infoHeader_s.size_image); printf("FileHeader.x_pixels_per_meter(%ld). \n", bmpData_s.infoHeader_s.x_pixels_per_meter); printf("FileHeader.y_pixels_per_meter (%ld). \n", bmpData_s.infoHeader_s.y_pixels_per_meter); printf("FileHeader.colors_used (%lu). \n", bmpData_s.infoHeader_s.colors_used); printf("FileHeader.colors_important (%lu). \n", bmpData_s.infoHeader_s.colors_important); printf("DATA_OFFSET read %lu\n", bmpData_s.fileHeader_s.offset_data); uint8_t colorData_au8[3] = {0}; for(uint8_t x=0; x<2-1; x++) { for(uint8_t y=0; y<3-1; y++) { fread(&colorData_au8, sizeof(colorData_au8), 1, imageFile); bmpData_s.colorData_sa[x][y].red = colorData_au8[2]; bmpData_s.colorData_sa[x][y].green = colorData_au8[1]; bmpData_s.colorData_sa[x][y].blue = colorData_au8[0]; } } for(uint8_t x=0; x<3-1; x++) { for(uint8_t y=0; y<2-1; y++) { if ((bmpData_s.colorData_sa[x][y].red > bmpData_s.colorData_sa[x][y].green) && (bmpData_s.colorData_sa[x][y].red > bmpData_s.colorData_sa[x][y].blue)) { printf("R "); } else if ((bmpData_s.colorData_sa[x][y].green > bmpData_s.colorData_sa[x][y].red) && (bmpData_s.colorData_sa[x][y].green > bmpData_s.colorData_sa[x][y].blue)) { printf("G "); } else if ((bmpData_s.colorData_sa[x][y].blue > bmpData_s.colorData_sa[x][y].red) && (bmpData_s.colorData_sa[x][y].blue > bmpData_s.colorData_sa[x][y].green)) { printf("B "); } else if ((bmpData_s.colorData_sa[x][y].blue == 0) && (bmpData_s.colorData_sa[x][y].red == 0) && (bmpData_s.colorData_sa[x][y].green == 0)) { printf("p "); } else { printf(". "); } } printf("\n"); } }