42 JSAMPLE* imageBuffer =
new JSAMPLE[imageDataVector.size()];
43 std::copy(imageDataVector.begin(), imageDataVector.end(), imageBuffer);
46 struct jpeg_compress_struct cinfo;
47 struct jpeg_error_mgr jerr;
50 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 const size_t rowStride =
static_cast<size_t>(imageData.
GetWidth()) * 3U;
74 while( cinfo.next_scanline < cinfo.image_height )
80 row_pointer[0] = &imageBuffer[
static_cast<size_t>(cinfo.next_scanline) * rowStride];
81 (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
84 jpeg_finish_compress(&cinfo);
88 jpeg_destroy_compress(&cinfo);
93 struct jpeg_error_mgr
pub;
112 (*cinfo->err->output_message) (cinfo);
120 char const* filename,
unsigned int& width,
unsigned int& height, std::vector<std::uint8_t>& rgbImageDataVector);
123 struct jpeg_decompress_struct* cinfo,
124 const unsigned char* memory,
127 unsigned int& height,
128 std::vector<std::uint8_t>& rgbImageDataVector);
143static bool ReadJpegFile(
char const* filename,
unsigned int& width,
unsigned int& height, std::vector<std::uint8_t>& rgbImageDataVector)
148 struct jpeg_decompress_struct cinfo;
150 return DoReadJpegFile(&cinfo, filename, width, height, rgbImageDataVector);
162DoReadJpegFile(
struct jpeg_decompress_struct* cinfo,
char const* filename,
unsigned int& width,
unsigned int& height, std::vector<std::uint8_t>& rgbImageDataVector)
173 if( (infile = fopen(filename,
"rb")) == NULL )
175 std::cout <<
"File can not be open." << std::endl;
182 cinfo->err = jpeg_std_error(&jerr.
pub);
189 jpeg_destroy_decompress(cinfo);
194 jpeg_create_decompress(cinfo);
198 jpeg_stdio_src(cinfo, infile);
202 (void)jpeg_read_header(cinfo, TRUE);
216 width = cinfo->image_width;
217 height = cinfo->image_height;
219 rgbImageDataVector.clear();
221 (void)jpeg_start_decompress(cinfo);
233 const JDIMENSION rowStride = cinfo->output_width *
static_cast<JDIMENSION
>(cinfo->output_components);
235 buffer = (*cinfo->mem->alloc_sarray)
236 ((j_common_ptr)cinfo, JPOOL_IMAGE, rowStride, 1);
245 while( cinfo->output_scanline < cinfo->output_height ) {
250 (void)jpeg_read_scanlines(cinfo, buffer, 1);
252 for(JDIMENSION i = 0; i < rowStride; ++i)
254 rgbImageDataVector.push_back(*(buffer[0] + i));
260 (void)jpeg_finish_decompress(cinfo);
268 jpeg_destroy_decompress(cinfo);
322 const unsigned char* memory,
325 unsigned int& height,
326 std::vector<std::uint8_t>& rgbImageDataVector)
328 struct jpeg_decompress_struct cinfo;
340 struct jpeg_decompress_struct* cinfo,
341 const unsigned char* memory,
344 unsigned int& height,
345 std::vector<std::uint8_t>& rgbImageDataVector)
349 cinfo->err = jpeg_std_error(&jerr.
pub);
354 jpeg_destroy_decompress(cinfo);
358 jpeg_create_decompress(cinfo);
362 std::numeric_limits<unsigned long>::max()))
364 jpeg_destroy_decompress(cinfo);
371 static_cast<unsigned long>(memorySize));
373 jpeg_read_header(cinfo, TRUE);
374 jpeg_start_decompress(cinfo);
376 width = cinfo->output_width;
377 height = cinfo->output_height;
379 const size_t components =
380 static_cast<size_t>(cinfo->output_components);
382 const size_t rowStride =
383 static_cast<size_t>(width) * components;
385 const size_t imageSize =
386 static_cast<size_t>(width) *
387 static_cast<size_t>(height) *
390 rgbImageDataVector.resize(imageSize);
392 while (cinfo->output_scanline < cinfo->output_height)
395 rgbImageDataVector.data() +
396 static_cast<size_t>(cinfo->output_scanline) * rowStride;
398 jpeg_read_scanlines(cinfo, &row, 1);
401 jpeg_finish_decompress(cinfo);
402 jpeg_destroy_decompress(cinfo);
Represents raw 2D image data stored in memory.
unsigned int GetWidth() const
Returns the image width.
std::vector< uint8_t > GetImageDataRGB() const
Gets raw image data in RGB format.
unsigned int GetHeight() const
Returns the image height.
static bool DoReadJpegFile(struct jpeg_decompress_struct *cinfo, char const *filename, unsigned int &width, unsigned int &height, std::vector< std::uint8_t > &rgbImageDataVector)
struct codec_error_mgr * codec_error_mgr_ptr
codec_error_exit(j_common_ptr cinfo)
static bool ReadJpegFromMemory(const unsigned char *memory, size_t memorySize, unsigned int &width, unsigned int &height, std::vector< std::uint8_t > &rgbImageDataVector)
Decode a JPEG image directly from a memory buffer.
static bool ReadJpegFile(char const *filename, unsigned int &width, unsigned int &height, std::vector< std::uint8_t > &rgbImageDataVector)
Reads a JPEG file into an RGB image buffer.
static void SaveTextureFileJpeg(rendering_engine::ImageData const &imageData, char const *filename)
Saves image data to a JPEG file.
static bool DoReadJpegFromMemory(struct jpeg_decompress_struct *cinfo, const unsigned char *memory, size_t memorySize, unsigned int &width, unsigned int &height, std::vector< std::uint8_t > &rgbImageDataVector)
struct jpeg_error_mgr pub