41 JSAMPLE* imageBuffer =
new JSAMPLE[imageDataVector.size()];
42 std::copy(imageDataVector.begin(), imageDataVector.end(), imageBuffer);
45 struct jpeg_compress_struct cinfo;
46 struct jpeg_error_mgr jerr;
49 JSAMPROW row_pointer[1];
52 cinfo.err = jpeg_std_error(&jerr);
53 jpeg_create_compress(&cinfo);
55 if( (outfile = fopen(filename,
"wb")) == NULL ) {
56 fprintf(stderr,
"can't open %s\n", filename);
59 jpeg_stdio_dest(&cinfo, outfile);
61 cinfo.image_width = imageData.
GetWidth();
62 cinfo.image_height = imageData.
GetHeight();
63 cinfo.input_components = 3;
64 cinfo.in_color_space = JCS_RGB;
66 jpeg_set_defaults(&cinfo);
68 jpeg_set_quality(&cinfo, quality, TRUE );
70 jpeg_start_compress(&cinfo, TRUE);
72 row_stride = imageData.
GetWidth() * 3;
74 while( cinfo.next_scanline < cinfo.image_height )
80 row_pointer[0] = &imageBuffer[cinfo.next_scanline * row_stride];
81 (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
84 jpeg_finish_compress(&cinfo);
88 jpeg_destroy_compress(&cinfo);
135static bool ReadJpegFile(
char const* filename,
unsigned int& width,
unsigned int& height, std::vector<unsigned int>& rgbImageDataVector)
140 struct jpeg_decompress_struct cinfo;
142 return DoReadJpegFile(&cinfo, filename, width, height, rgbImageDataVector);
154DoReadJpegFile(
struct jpeg_decompress_struct* cinfo,
char const* filename,
unsigned int& width,
unsigned int& height, std::vector<unsigned int>& rgbImageDataVector)
166 if( (infile = fopen(filename,
"rb")) == NULL )
168 std::cout <<
"File can not be open." << std::endl;
175 cinfo->err = jpeg_std_error(&jerr.
pub);
182 jpeg_destroy_decompress(cinfo);
187 jpeg_create_decompress(cinfo);
191 jpeg_stdio_src(cinfo, infile);
195 (void)jpeg_read_header(cinfo, TRUE);
209 width = cinfo->image_width;
210 height = cinfo->image_height;
212 rgbImageDataVector.clear();
214 (void)jpeg_start_decompress(cinfo);
226 row_stride = cinfo->output_width * cinfo->output_components;
228 buffer = (*cinfo->mem->alloc_sarray)
229 ((j_common_ptr)cinfo, JPOOL_IMAGE, row_stride, 1);
238 while( cinfo->output_scanline < cinfo->output_height ) {
243 (void)jpeg_read_scanlines(cinfo, buffer, 1);
245 for(
int i = 0; i < row_stride; ++i )
247 rgbImageDataVector.push_back(*(buffer[0] + i));
253 (void)jpeg_finish_decompress(cinfo);
261 jpeg_destroy_decompress(cinfo);
315 const unsigned char* memory,
318 unsigned int& height,
319 std::vector<unsigned int>& rgbImageDataVector)
321 struct jpeg_decompress_struct cinfo;
324 cinfo.err = jpeg_std_error(&jerr.
pub);
328 jpeg_destroy_decompress(&cinfo);
332 jpeg_create_decompress(&cinfo);
334 jpeg_mem_src(&cinfo, memory, memorySize);
336 jpeg_read_header(&cinfo, TRUE);
337 jpeg_start_decompress(&cinfo);
339 width = cinfo.output_width;
340 height = cinfo.output_height;
341 unsigned int components = cinfo.output_components;
343 size_t row_stride = width * components;
344 rgbImageDataVector.resize(width * height * components);
346 while (cinfo.output_scanline < cinfo.output_height)
348 unsigned char* row = (
unsigned char*)(
349 rgbImageDataVector.data() +
350 cinfo.output_scanline * row_stride
352 jpeg_read_scanlines(&cinfo, &row, 1);
355 jpeg_finish_decompress(&cinfo);
356 jpeg_destroy_decompress(&cinfo);
static bool ReadJpegFile(char const *filename, unsigned int &width, unsigned int &height, std::vector< unsigned int > &rgbImageDataVector)
Reads a JPEG file into an RGB image buffer.
static bool DoReadJpegFile(struct jpeg_decompress_struct *cinfo, char const *filename, unsigned int &width, unsigned int &height, std::vector< unsigned int > &rgbImageDataVector)
static bool ReadJpegFromMemory(const unsigned char *memory, size_t memorySize, unsigned int &width, unsigned int &height, std::vector< unsigned int > &rgbImageDataVector)
Decode a JPEG image directly from a memory buffer.