struct image *png_open(FILE *f){ struct png_t *p; rewind(f); if(!ispng(f)) return NULL; p = malloc(sizeof(struct png_t)); if((p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL){ free(p); return NULL; } if((p->info_ptr = png_create_info_struct(p->png_ptr)) == NULL){ png_destroy_read_struct(&p->png_ptr, (png_infopp)NULL, (png_infopp)NULL); free(p); return NULL; } if((p->end_info = png_create_info_struct(p->png_ptr)) == NULL){ png_destroy_read_struct(&p->png_ptr, &p->info_ptr, (png_infopp)NULL); free(p); return NULL; } if(setjmp(png_jmpbuf(p->png_ptr))){ png_destroy_read_struct(&p->png_ptr, &p->info_ptr, &p->end_info); free(p); return NULL; } p->f = f; rewind(f); png_init_io(p->png_ptr, f); png_read_info(p->png_ptr, p->info_ptr); p->img.bufwidth = png_get_image_width(p->png_ptr, p->info_ptr); p->img.bufheight = png_get_image_height(p->png_ptr, p->info_ptr); p->img.fmt = &libpng; return (struct image *)p; }
int main(int argc, char **argv) { DIR *imgdir = opendir("img/"); DIR *editdir = opendir("img/edit"); struct dirent *file; std::string outfile; if (imgdir == NULL) { std::cerr << "Can't open ./img." << std::endl; exit(1); } if (editdir == NULL) { std::cerr << "Can't open ./img/edit." << std::endl; exit(1); } closedir(editdir); if (argc < 2) { std::cerr << "Usage: " << argv[0] << " [brightness] <brightness> [gamma] <gamma>" << std::endl; exit(1); } double brightness = 1.0; double gamma = 1.0; unsigned int threads = 1; for (int i = 1; i < argc; i++) { if (strcmp("brightness", argv[i]) == 0) { if (argc > i + 1) { brightness = strtod(argv[i + 1], NULL); assert(brightness > 0); } } if (strcmp("gamma", argv[i]) == 0) { gamma = strtod(argv[i + 1], NULL); assert(gamma > 0); } if (strcmp("threads", argv[i]) == 0) { threads = strtoul(argv[i + 1], NULL, 0); assert(threads > 0); } } FreeImage_Initialise(); std::string temp; if (threads == 1) { while ((file = readdir(imgdir)) != NULL) { if (ispng(file -> d_name)) { gen_edit_filename(file -> d_name, temp); if (!ispng(temp)) { std::cout << "Processing " << file -> d_name << std::endl; gen_edit_filename(file -> d_name, outfile); if (process_image(file -> d_name, outfile.c_str(), brightness, gamma)) { std::cout << "Saved " << outfile << std::endl; } } } } } else { std::queue<std::string> input; std::mutex lock; while ((file = readdir(imgdir)) != NULL) { if (ispng(file -> d_name)) { input.push(file -> d_name); } } process_threaded(&input, &lock, brightness, gamma, threads); } closedir(imgdir); FreeImage_DeInitialise(); return 0; }