123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include "img.h"
- image initialize_png(char *title, char *filename, int width, int height)
- {
- image ret;
- FILE *fp = NULL;
- fp = fopen(filename, "wb");
- if (fp == NULL) {
- fprintf(stderr, "could not create %s", filename);
- exit(EXIT_FAILURE);
- }
- png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
- NULL,
- NULL,
- NULL);
- if (png_ptr == NULL) {
- fprintf(stderr, "Could not create write struct. libpng\n");
- }
- png_infop info_ptr = png_create_info_struct(png_ptr);
- if (info_ptr == NULL) {
- fprintf(stderr, "Could not create info struct. libpng\n");
- }
- if (setjmp(png_jmpbuf(png_ptr))) {
- fprintf(stderr, "Error during png creation\n");
- }
- png_init_io(png_ptr, fp);
- //Write header
- png_set_IHDR(png_ptr,
- info_ptr,
- width,
- height,
- 8,
- PNG_COLOR_TYPE_RGB,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
- if (title != NULL) {
- png_text title_text;
- title_text.compression = PNG_TEXT_COMPRESSION_NONE;
- title_text.key = "Title";
- title_text.text = title;
- png_set_text(png_ptr, info_ptr, &title_text, 1);
- }
- png_write_info(png_ptr, info_ptr);
- ret.png_ptr = png_ptr;
- ret.info_ptr = info_ptr;
- ret.width = width;
- ret.height = height;
- ret.fp = fp;
- return ret;
- }
- void write_image(image * img, pix_row * img_array)
- {
- png_bytep row = NULL;
- int x = 0, y = 0;
- row = (png_bytep) malloc(3 * img->width * sizeof(png_byte));
- for (y = 0; y < img->height; y++) {
- for (x = 0; x < img->width; x++) {
- row[x * 3 + 0] = img_array[x].p[y].r; //red
- row[x * 3 + 1] = img_array[x].p[y].g; // green
- row[x * 3 + 2] = img_array[x].p[y].b; // blue
- }
- png_write_row(img->png_ptr, row);
- }
- png_write_end(img->png_ptr, img->info_ptr);
- free(row);
- }
- void finish_image(image * img)
- {
- fclose(img->fp);
- png_free_data(img->png_ptr, img->info_ptr, PNG_FREE_ALL, -1);
- png_destroy_write_struct(&img->png_ptr, NULL);
- }
|