uint8_t * ReadToPNGPicture(uint8_t * buf, size_t buf_len, size_t * buf_out, int bit_depth, int * returnValue) { mem_encode mempng; BPGDecoderContext *img; img = bpg_decoder_open(); if (bpg_decoder_decode(img, buf, buf_len) < 0) { fprintf(stderr, "Could not decode image\n"); return 0; } *returnValue = png_save(img, &mempng, bit_depth); bpg_decoder_close(img); buf_out = mempng.size; return mempng.buffer; }
int main(int argc, char **argv) { FILE *f; BPGDecoderContext *img; uint8_t *buf; int buf_len, bit_depth, c, show_info; const char *outfilename, *filename, *p; outfilename = "out.png"; bit_depth = 8; show_info = 0; for(;;) { c = getopt(argc, argv, "ho:b:i"); if (c == -1) break; switch(c) { case 'h': show_help: help(); break; case 'o': outfilename = optarg; break; case 'b': bit_depth = atoi(optarg); break; case 'i': show_info = 1; break; default: exit(1); } } if (optind >= argc) goto show_help; filename = argv[optind++]; if (show_info) { bpg_show_info(filename, 1); return 0; } f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "Could not open %s\n", filename); exit(1); } fseek(f, 0, SEEK_END); buf_len = ftell(f); fseek(f, 0, SEEK_SET); buf = malloc(buf_len); if (fread(buf, 1, buf_len, f) != buf_len) { fprintf(stderr, "Error while reading file\n"); exit(1); } fclose(f); img = bpg_decoder_open(); if (bpg_decoder_decode(img, buf, buf_len) < 0) { fprintf(stderr, "Could not decode image\n"); exit(1); } free(buf); #ifdef USE_PNG p = strrchr(outfilename, '.'); if (p) p++; if (p && strcasecmp(p, "ppm") != 0) { png_save(img, outfilename, bit_depth); } else #endif { ppm_save(img, outfilename); } bpg_decoder_close(img); return 0; }
static int grab_command(shell_t *shell, shell_argv_t *cmd_argv, char *tag) { int argc = cmd_argv->argc; char **argv = cmd_argv->argv; char *hdr = log_hdr_(tag); int ret = -1; /* Set error reporting tag */ error_default_tag(tag); /* The 'stop' qualifier */ if ( (argc > 1) && (strcmp(argv[1], "stop") == 0) ) { /* Check number of arguments */ if ( check_argc(shell, cmd_argv, tag, 2, 2) ) return -1; grab_end = 0; if ( grab_n > 0 ) { printf("%s%d frames recorded\n", hdr, grab_n); grab_n = 0; } else { printf("%sNo recording in progress\n", hdr); } ret = 0; } /* Unknown qualifier */ else { frame_t *frame = grab_display->root; char *window_str = NULL; frame_geometry_t window; char *fname = NULL; int grab_animation = 0; long grab_dt = 0; int n; /* Check number of arguments */ if ( check_argc(shell, cmd_argv, tag, 1, 4) ) return -1; for (n = 1; n < argc; n++) { char *str = argv[n]; char *eq = strchr(str, '='); if ( eq != NULL ) { *(eq++) = '\0'; if ( strcmp(str, "frame") == 0 ) { frame = frame_get_child_by_id(grab_display->root, eq); if ( frame == NULL ) { error(NULL, "Unknown frame '%s'", eq); return -1; } } else if ( strcmp(str, "window") == 0 ) { window_str = eq; } else if ( strcmp(str, "t") == 0 ) { grab_begin = (tstamp_get() / 1000); grab_end = 0; grab_n = 0; grab_dt = (atoi(eq) * 1000); if ( grab_dt < 0 ) grab_dt = 0; grab_end = grab_begin + grab_dt; grab_animation = 1; } else { error(tag, "Illegal qualifier '%s'", str); return -1; } } else { fname = str; } } /* Set source frame */ if ( window_str != NULL ) { if ( frame_rgb_parse_geometry(&(frame->hdr.fb->rgb), window_str, &window) ) { error(NULL, "Syntax error in window geometry"); return -1; } } else { window = frame->g; window.x = 0; window.y = 0; } /* Retrieve output format */ grab_ppm = (ppm_filename_suffix(fname) != NULL); /* Construct an image file name */ fname = grab_ppm ? ppm_filename(fname) : png_filename(fname); if ( fname == NULL ) { error(tag, "Failed to construct a valid image file name"); return -1; } if ( grab_animation ) { char *suffix_str; char *suffix; if ( grab_ppm ) { suffix_str = PPM_SUFFIX; suffix = ppm_filename_suffix(fname); } else { suffix_str = PNG_SUFFIX; suffix = png_filename_suffix(fname); } if ( suffix != NULL ) *suffix = '\0'; grab_fname_size = strlen(fname) + 16; if ( grab_fname_fmt != NULL ) free(grab_fname_fmt); grab_fname_fmt = (char *) malloc(grab_fname_size); snprintf(grab_fname_fmt, grab_fname_size, "%s.%%09lu%s", fname, suffix_str); grab_frame = frame; grab_window = window; ret = grab_save(0); if ( ret == 0 ) { printf("%sframe=%s window=%s t=%ld %s.*%s\n", hdr, frame->hdr.id, frame_geometry_str(&window), grab_dt / 1000, fname, suffix_str); } else { printf("%sFailed to write image file '%s'", hdr, grab_fname); grab_end = 0; } } else { if ( grab_ppm ) ret = ppm_save(&(frame->hdr.fb->rgb), &window, fname); else ret = png_save(&(frame->hdr.fb->rgb), &window, fname); if ( ret == 0 ) printf("%sframe=%s window=%s %s\n", hdr, frame->hdr.id, frame_geometry_str(&window), fname); else printf("%sFailed to write image file '%s'", hdr, fname); } free(fname); } return ret; }