#include #include #include #include #include #include "bitmap.h" #ifdef _DEBUG #warning "Compiling with DEBUG" #define DEBUG_PRINTF(...) { printf(__VA_ARGS__); } #else #define DEBUG_PRINTF(...) { } #endif #define _HEADER_SIZE 54 //Fileheader + infoheader #define IDENTIFIER 0x424d //BM BitMap identifier //Address Definitions #define BF_TYPE 0x00 #define BF_SIZE 0x02 #define BF_OFF_BITS 0x0a #define BI_SIZE 0x0e #define BI_WIDTH 0x12 #define BI_HEIGHT 0x16 #define BI_BIT_COUNT 0x1c #define BI_COMPRESSION 0x1e #define BI_SIZE_IMAGE 0x22 #define BI_CLR_USED 0x2e #define BI_CLR_IMPORTANT 0x32 #define CHAR_SIZE_X 2 //How many pixels should form one ASCII char? #define CHAR_SIZE_Y (2 * CHAR_SIZE_X) struct prog_param { char *filename; unsigned int charsize_x; unsigned int charsize_y; }; struct prog_param parse_args(int argc, char *argv[]); void print_help( void ); const char map[] = {' ', ' ', '.', ',', '`', '-', '~', '"', '*', ':', ';', '<', '!', '/', '?', '%', '&', '=', '$', '#'}; //const char map[] = {' ', '`', '.', ',', ':', ';', '\"', '+', '#', '@'}; //Calculate average char avg(int argc, char *argv); //Calculate luminance from rgb_avg //Order LSB first: BGR char rgb_avg(uint8_t R, uint8_t G, uint8_t B); //Select Char based on 1B brightness Value char calc_char(uint8_t _c, uint8_t _min, uint8_t _max); int main(int argc, char *argv[]) { struct prog_param args = parse_args(argc, argv); char **ascii_buff; uint8_t b_max = 0x00; uint8_t b_min = 0xff; struct bitmap_pixel_data bitmap; bitmap = bitmap_read(args.filename); if(bitmap.error) { printf("Error reading file\n"); return 1; } //Calculate Averages of CHAR_SIZE x CHAR_SIZE blocks unsigned int size_x,size_y; size_x = bitmap.x / args.charsize_x; size_y = bitmap.y / args.charsize_y; DEBUG_PRINTF("Creating ASCII File %u x %u\n", size_x, size_y); ascii_buff = malloc(sizeof(*ascii_buff) * size_x); for (int i = 0; i < size_x; i++) { ascii_buff[i] = malloc(sizeof(ascii_buff[i]) * size_y); } //Nest thine Lööps for(int x = 0; x < size_x; x++) { for(int y = 0; y < size_y; y++) { char b[args.charsize_x][args.charsize_y]; for(int r = 0; r < args.charsize_y; r++) { int row = y * args.charsize_y + r; for(int c = 0; c < args.charsize_x; c++) { int col = x * args.charsize_x + c; //b[c][r] = avg(3, (char*)&bitmap_buff[row][col]); b[c][r] = rgb_avg(bitmap.R[col][row],bitmap.G[col][row],bitmap.B[col][row]); } } ascii_buff[x][y] = avg(args.charsize_x * args.charsize_y, (char*)&b); if((uint8_t)ascii_buff[x][y] < b_min) b_min = ascii_buff[x][y]; if((uint8_t)ascii_buff[x][y] > b_max) b_max = ascii_buff[x][y]; } } DEBUG_PRINTF("Brightness Values: Min: %u Max: %u\n", b_min, b_max); for(int y = 0; y