Public feed
#726716
#include <cstdio>#include "include/jpeglib.h"#include "util_graphics.h"unsigned char *loadJPEG(char *filename, unsigned int *w, unsigned int *h, unsigned int *components) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; FILE * infile; unsigned char *buffer, *ptr; unsigned int nval; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); if ((infile = fopen(filename, "rb")) == NULL) { fprintf(stderr, "Can't open '%s'\n", filename); jpeg_destroy_decompress(&cinfo); return NULL; } jpeg_stdio_src(&cinfo, infile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); *w = cinfo.output_width; *h = cinfo.output_height; *components = cinfo.output_components; nval = cinfo.output_width * cinfo.output_components * cinfo.output_height; buffer = (unsigned char *)malloc(sizeof(unsigned char) * nval); if (!buffer) { fprintf(stderr, "Unable to process, out of memory\n"); jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); return NULL; } ptr = buffer + (cinfo.output_width * cinfo.output_components) * (cinfo.output_height - 1); while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, &ptr, 1); ptr -= cinfo.output_width * cinfo.output_components; } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); return buffer;}