Esempio n. 1
0
File: png.c Progetto: rtandy/meh
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;
}
Esempio n. 2
0
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;
}