Skip to content

Commit c74230c

Browse files
committed
added bmp to png converter & refactored GTK
1 parent ef7ff45 commit c74230c

File tree

3 files changed

+125
-11
lines changed

3 files changed

+125
-11
lines changed

src/converters/bmp_to_jpeg.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,8 @@
22
#include <stdlib.h>
33
#include <jpeglib.h>
44

5-
int bmp_to_jpeg(int argc, char *argv[])
5+
int bmp_to_jpeg(const char *input_filename, const char *output_filename)
66
{
7-
if (argc != 3)
8-
{
9-
fprintf(stderr, "Usage: %s input.bmp output.jpg\n", argv[0]);
10-
return 1;
11-
}
12-
13-
char *input_filename = argv[1];
14-
char *output_filename = argv[2];
15-
167
// open BMP file for reading
178
FILE *input_file = fopen(input_filename, "rb");
189
if (!input_file)

src/converters/bmp_to_png.c

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <png.h>
4+
5+
int bmp_to_png(const char *input_filename, const char *output_filename)
6+
{
7+
// open BMP file for reading
8+
FILE *input_file = fopen(input_filename, "rb");
9+
if (!input_file)
10+
{
11+
fprintf(stderr, "Error: could not open input file %s\n", input_filename);
12+
return 1;
13+
}
14+
// read BMP header
15+
unsigned char header[54];
16+
if (fread(header, sizeof(unsigned char), 54, input_file) != 54)
17+
{
18+
fprintf(stderr, "Error: invalid BMP file %s\n", input_filename);
19+
fclose(input_file);
20+
return 1;
21+
}
22+
// check if BMP file is valid
23+
if (header[0] != 'B' || header[1] != 'M')
24+
{
25+
fprintf(stderr, "Error: invalid BMP file %s\n", input_filename);
26+
fclose(input_file);
27+
return 1;
28+
}
29+
// get image width and height from BMP header
30+
int width = *(int *)&header[18];
31+
int height = *(int *)&header[22];
32+
// calculate padding for BMP file
33+
int padding = 0;
34+
while ((width * 3 + padding) % 4 != 0)
35+
{
36+
padding++;
37+
}
38+
// allocate memory for BMP image data
39+
unsigned char *bmp_data = (unsigned char *)malloc(width * height * 3 + height * padding);
40+
if (!bmp_data)
41+
{
42+
fprintf(stderr, "Error: could not allocate memory for BMP image data\n");
43+
fclose(input_file);
44+
return 1;
45+
}
46+
// read BMP image data
47+
if (fread(bmp_data, sizeof(unsigned char), width * height * 3 + height * padding, input_file) != width * height * 3 + height * padding)
48+
{
49+
fprintf(stderr, "Error: invalid BMP file %s\n", input_filename);
50+
free(bmp_data);
51+
fclose(input_file);
52+
return 1;
53+
}
54+
// close BMP file
55+
fclose(input_file);
56+
// open PNG file for writing
57+
FILE *output_file = fopen(output_filename, "wb");
58+
if (!output_file)
59+
{
60+
fprintf(stderr, "Error: could not open output file %s\n", output_filename);
61+
free(bmp_data);
62+
return 1;
63+
}
64+
// create PNG write struct
65+
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
66+
if (!png_ptr)
67+
{
68+
fprintf(stderr, "Error: could not create PNG write struct\n");
69+
free(bmp_data);
70+
fclose(output_file);
71+
return 1;
72+
}
73+
// create PNG info struct
74+
png_infop info_ptr = png_create_info_struct(png_ptr);
75+
if (!info_ptr)
76+
{
77+
fprintf(stderr, "Error: could not create PNG info struct\n");
78+
free(bmp_data);
79+
png_destroy_write_struct(&png_ptr, NULL);
80+
fclose(output_file);
81+
return 1;
82+
}
83+
// set error handling
84+
if (setjmp(png_jmpbuf(png_ptr)))
85+
{
86+
fprintf(stderr, "Error: PNG error\n");
87+
free(bmp_data);
88+
png_destroy_write_struct(&png_ptr, &info_ptr);
89+
fclose(output_file);
90+
return 1;
91+
}
92+
// set PNG output file
93+
png_init_io(png_ptr, output_file);
94+
// set PNG header info
95+
png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
96+
// write PNG header info
97+
png_write_info(png_ptr, info_ptr);
98+
// write PNG image data
99+
for (int y = 0; y < height; y++)
100+
{
101+
png_bytep row_pointer = &bmp_data[(height - y - 1) * (width * 3 + padding)];
102+
png_write_row(png_ptr, row_pointer);
103+
}
104+
// finish writing PNG file
105+
png_write_end(png_ptr, NULL);
106+
// free PNG write struct and info struct
107+
png_destroy_write_struct(&png_ptr, &info_ptr);
108+
// free BMP image data
109+
free(bmp_data);
110+
// close PNG file
111+
fclose(output_file);
112+
printf("Converted %s to %s\n", input_filename, output_filename);
113+
114+
return 0;
115+
}

src/gtk_gui.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@
1313
static void black_and_white_filter_apply(GtkWidget *widget, gpointer data)
1414
{
1515
GtkWidget *image = data;
16-
black_and_white_filter("assets/images/test_image.bmp", "assets/images/test_image_black_and_white.bmp");
16+
17+
black_and_white_filter("assets/images/test_image.bmp", "assets/images/test_image_bright.bmp");
1718
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_black_and_white.bmp");
1819
g_print("Black And White Filter Has Been Applied\n");
1920
}
2021

2122
static void bright_filter_apply(GtkWidget *widget, gpointer data)
2223
{
2324
GtkWidget *image = data;
25+
2426
bright_filter("assets/images/test_image.bmp", "assets/images/test_image_bright.bmp");
2527
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_bright.bmp");
2628
g_print("Bright Filter Has Been Applied\n");
@@ -29,6 +31,7 @@ static void bright_filter_apply(GtkWidget *widget, gpointer data)
2931
static void dark_filter_apply(GtkWidget *widget, gpointer data)
3032
{
3133
GtkWidget *image = data;
34+
3235
dark_filter("assets/images/test_image.bmp", "assets/images/test_image_dark.bmp");
3336
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_dark.bmp");
3437
g_print("Dark Filter Has Been Applied\n");
@@ -37,6 +40,7 @@ static void dark_filter_apply(GtkWidget *widget, gpointer data)
3740
static void emboss_filter_apply(GtkWidget *widget, gpointer data)
3841
{
3942
GtkWidget *image = data;
43+
4044
emboss_filter("assets/images/test_image.bmp", "assets/images/test_image_emboss.bmp");
4145
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_emboss.bmp");
4246
g_print("Emboss Filter Has Been Applied\n");
@@ -45,6 +49,7 @@ static void emboss_filter_apply(GtkWidget *widget, gpointer data)
4549
static void negative_filter_apply(GtkWidget *widget, gpointer data)
4650
{
4751
GtkWidget *image = data;
52+
4853
negative_filter("assets/images/test_image.bmp", "assets/images/test_image_negative.bmp");
4954
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_negative.bmp");
5055
g_print("Negative Filter Has Been Applied\n");
@@ -53,6 +58,7 @@ static void negative_filter_apply(GtkWidget *widget, gpointer data)
5358
static void pixelate_filter_apply(GtkWidget *widget, gpointer data)
5459
{
5560
GtkWidget *image = data;
61+
5662
pixelate_filter("assets/images/test_image.bmp", "assets/images/test_image_pixelate.bmp");
5763
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_pixelate.bmp");
5864
g_print("Pixelate Filter Has Been Applied\n");
@@ -61,6 +67,7 @@ static void pixelate_filter_apply(GtkWidget *widget, gpointer data)
6167
static void rgb_to_gray_filter_apply(GtkWidget *widget, gpointer data)
6268
{
6369
GtkWidget *image = data;
70+
6471
rgb_to_gray_filter("assets/images/test_image.bmp", "assets/images/test_image_rgb_to_gray.bmp");
6572
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_rgb_to_gray.bmp");
6673
g_print("RGB To Gray Filter Has Been Applied\n");
@@ -69,6 +76,7 @@ static void rgb_to_gray_filter_apply(GtkWidget *widget, gpointer data)
6976
static void sepia_filter_apply(GtkWidget *widget, gpointer data)
7077
{
7178
GtkWidget *image = data;
79+
7280
sepia_filter("assets/images/test_image.bmp", "assets/images/test_image_sepia.bmp");
7381
gtk_image_set_from_file(GTK_IMAGE(image), "assets/images/test_image_sepia.bmp");
7482
g_print("Sepia Filter Has Been Applied\n");

0 commit comments

Comments
 (0)