diff --git a/images/bmp-format.c b/images/bmp-format.c index 4837218..f49ce6d 100644 --- a/images/bmp-format.c +++ b/images/bmp-format.c @@ -3,25 +3,21 @@ #include "images.h" // write an int to a byte array -void bmp__write_int(char* bytes, int num) { +void bmp__write_int(unsigned char* bytes, int num) { for (int i = 0; i < 4; i++) { bytes[i] = num >> (i * 8); } } -void bmp__write_byte(char* bytes, int num) { - bytes[0] = (char) num; -} - -void bmp__write_16bit(char* bytes, int num) { +void bmp__write_16bit(unsigned char* bytes, int num) { for (int i = 0; i < 2; i++) { bytes[i] = num >> (i * 8); } } -int bmp__align_to_four_bytes(int size) { - int os = size % 4; - return os == 0 ? size : size + (4 - os); +int bmp__align_to_four_bytes(int row_length) { + int os =row_length % 4; + return os == 0 ?row_length : row_length + (4 - os); } int bmp__image_byte_size(Image image) { @@ -30,9 +26,9 @@ int bmp__image_byte_size(Image image) { // BITMAPCOREHEADER = 12 bytes int size = 14 + 12; // width must be padded to align to 4 bytes - int width_bytes = bmp__align_to_four_bytes(image.width * 3); // 3 bytes per pixel - // add width_bytes * height to total size - size += width_bytes * image.height; + int row_bytes = bmp__align_to_four_bytes(image.width * 3); // 3 bytes per pixel + // add row_bytes * height to total size + size += row_bytes * image.height; return size; } @@ -50,22 +46,30 @@ int bmp__image_byte_size(Image image) { // 0x01 0x00 number of color planes (must be 1) // 0x18 0x00 number of bits per pixel (3 * 8 = 24) -int image_save_bmp(Image image, char* path) { + +// char* bytes; + +// bytes + 2 => zeigt auf offset 2 (ist char*) +// bytes[2] => wert an offset 2 (ist char) + +int image_save_bmp(Image image, const char* path) { int size = bmp__image_byte_size(image); - char* bytes = calloc(sizeof(char), size); + unsigned char* bytes = calloc(sizeof(char), size); // magic bytes, signature "BM" - bytes[0] = 0x42; - bytes[1] = 0x4d; + // bmp header: + bytes[0] = 'B'; + bytes[1] = 'M'; // write size to header bmp__write_int(bytes + 2, size); // the next 4 byte are zeros - // piyel array offset + // pixel array offset bmp__write_int(bytes + 10, 14 + 12); - bmp__write_int(bytes + 14, 12); + // DIB header: + bmp__write_int(bytes + 14, 12); // header size bmp__write_16bit(bytes + 18, image.width); // width bmp__write_16bit(bytes + 20, image.height); // height - bmp__write_16bit(bytes + 22, 1); // color planes - bmp__write_16bit(bytes + 24, 3 * 8); // bits per pixel + bmp__write_16bit(bytes + 22, 1); // color planes + bmp__write_16bit(bytes + 24, 3 * 8); // bits per pixel int byte_offset = 26; int byte_pos = 0; diff --git a/images/images.c b/images/images.c index 04debae..8da97c5 100644 --- a/images/images.c +++ b/images/images.c @@ -12,9 +12,9 @@ int image_new(int width, int height, Image* img) { img->width = width; // initialize bitmap... - img->bitmap = malloc(height * sizeof(int*)); + img->bitmap = malloc(height * sizeof(char*)); for (int i = 0; i < height; i++) { - img->bitmap[i] = malloc(3 * width * sizeof(int)); + img->bitmap[i] = malloc(3 * width * sizeof(char)); } //*image = *img; @@ -24,9 +24,9 @@ int image_new(int width, int height, Image* img) { int image_set_px(Image image, int x, int y, int r, int g, int b) { if (!image_check_coords(image, x, y)) return 0; - image.bitmap[y][(3 * x) + 0] = (char) r; - image.bitmap[y][(3 * x) + 1] = (char) g; - image.bitmap[y][(3 * x) + 2] = (char) b; + image.bitmap[y][(3 * x) + 0] = r; + image.bitmap[y][(3 * x) + 1] = g; + image.bitmap[y][(3 * x) + 2] = b; return 1; } @@ -39,13 +39,10 @@ int image_set_px_c(Image image, int x, int y, Color color) { image.bitmap[y][(3 * x) + 0] = color.r; image.bitmap[y][(3 * x) + 1] = color.g; image.bitmap[y][(3 * x) + 2] = color.b; - } else { - - //printf("adding %d to %f\n", (color.alpha * color.r), ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0]/* & 0x000000ff */))); - - image.bitmap[y][(3 * x) + 0] = (color.alpha * (color.r/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0]/* & 0x000000ff */)); - image.bitmap[y][(3 * x) + 1] = (color.alpha * (color.g/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 1]/* & 0x000000ff */)); - image.bitmap[y][(3 * x) + 2] = (color.alpha * (color.b/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 2]/* & 0x000000ff */)); + } else { + image.bitmap[y][(3 * x) + 0] = (color.alpha * (color.r)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0])); + image.bitmap[y][(3 * x) + 1] = (color.alpha * (color.g)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 1])); + image.bitmap[y][(3 * x) + 2] = (color.alpha * (color.b)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 2])); } return 1; diff --git a/images/images.h b/images/images.h index 22d6018..167c309 100644 --- a/images/images.h +++ b/images/images.h @@ -43,7 +43,7 @@ int image_draw_square(Image image, int x, int y, int s, Color color); // bmp format specifics: -int image_save_bmp(Image image, char* path); +int image_save_bmp(Image image, const char* path); #include "images.c" #include "bmp-format.c"