39 #include "vpImageIoBackend.h"
40 #include <visp3/core/vpImageConvert.h>
42 #if defined(VISP_HAVE_JPEG)
51 #if defined(VISP_HAVE_JPEG)
63 struct jpeg_compress_struct cinfo;
64 struct jpeg_error_mgr jerr;
67 cinfo.err = jpeg_std_error(&jerr);
68 jpeg_create_compress(&cinfo);
71 if (filename.empty()) {
75 file = fopen(filename.c_str(),
"wb");
77 if (file ==
nullptr) {
84 jpeg_stdio_dest(&cinfo, file);
86 cinfo.image_width = width;
87 cinfo.image_height = height;
88 cinfo.input_components = 1;
89 cinfo.in_color_space = JCS_GRAYSCALE;
90 jpeg_set_defaults(&cinfo);
91 jpeg_set_quality(&cinfo, quality, TRUE);
93 jpeg_start_compress(&cinfo, TRUE);
96 line =
new unsigned char[width];
97 unsigned char *input = (
unsigned char *)I.
bitmap;
98 while (cinfo.next_scanline < cinfo.image_height) {
99 for (
unsigned int i = 0; i < width; ++i) {
103 jpeg_write_scanlines(&cinfo, &line, 1);
106 jpeg_finish_compress(&cinfo);
107 jpeg_destroy_compress(&cinfo);
120 void writeJPEGLibjpeg(
const vpImage<vpRGBa> &I,
const std::string &filename,
int quality)
122 struct jpeg_compress_struct cinfo;
123 struct jpeg_error_mgr jerr;
126 cinfo.err = jpeg_std_error(&jerr);
127 jpeg_create_compress(&cinfo);
130 if (filename.empty()) {
134 file = fopen(filename.c_str(),
"wb");
136 if (file ==
nullptr) {
143 jpeg_stdio_dest(&cinfo, file);
145 cinfo.image_width = width;
146 cinfo.image_height = height;
147 cinfo.input_components = 3;
148 cinfo.in_color_space = JCS_RGB;
149 jpeg_set_defaults(&cinfo);
150 jpeg_set_quality(&cinfo, quality, TRUE);
152 jpeg_start_compress(&cinfo, TRUE);
155 line =
new unsigned char[3 * width];
156 unsigned char *input = (
unsigned char *)I.
bitmap;
157 while (cinfo.next_scanline < cinfo.image_height) {
158 for (
unsigned int i = 0; i < width; ++i) {
159 line[i * 3] = *(input);
161 line[i * 3 + 1] = *(input);
163 line[i * 3 + 2] = *(input);
167 jpeg_write_scanlines(&cinfo, &line, 1);
170 jpeg_finish_compress(&cinfo);
171 jpeg_destroy_compress(&cinfo);
193 struct jpeg_decompress_struct cinfo;
194 struct jpeg_error_mgr jerr;
197 cinfo.err = jpeg_std_error(&jerr);
198 jpeg_create_decompress(&cinfo);
201 if (filename.empty()) {
205 file = fopen(filename.c_str(),
"rb");
207 if (file ==
nullptr) {
211 jpeg_stdio_src(&cinfo, file);
212 jpeg_read_header(&cinfo, TRUE);
214 unsigned int width = cinfo.image_width;
215 unsigned int height = cinfo.image_height;
220 jpeg_start_decompress(&cinfo);
222 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
223 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
225 if (cinfo.out_color_space == JCS_RGB) {
227 unsigned char *output = (
unsigned char *)Ic.bitmap;
228 while (cinfo.output_scanline < cinfo.output_height) {
229 jpeg_read_scanlines(&cinfo, buffer, 1);
230 for (
unsigned int i = 0; i < width; ++i) {
231 *(output++) = buffer[0][i * 3];
232 *(output++) = buffer[0][i * 3 + 1];
233 *(output++) = buffer[0][i * 3 + 2];
240 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
241 while (cinfo.output_scanline < cinfo.output_height) {
242 unsigned int row = cinfo.output_scanline;
243 jpeg_read_scanlines(&cinfo, buffer, 1);
244 memcpy(I[row], buffer[0], rowbytes);
248 jpeg_finish_decompress(&cinfo);
249 jpeg_destroy_decompress(&cinfo);
273 struct jpeg_decompress_struct cinfo;
274 struct jpeg_error_mgr jerr;
277 cinfo.err = jpeg_std_error(&jerr);
278 jpeg_create_decompress(&cinfo);
281 if (filename.empty()) {
285 file = fopen(filename.c_str(),
"rb");
287 if (file ==
nullptr) {
291 jpeg_stdio_src(&cinfo, file);
293 jpeg_read_header(&cinfo, TRUE);
295 unsigned int width = cinfo.image_width;
296 unsigned int height = cinfo.image_height;
301 jpeg_start_decompress(&cinfo);
303 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
304 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
306 if (cinfo.out_color_space == JCS_RGB) {
307 unsigned char *output = (
unsigned char *)I.
bitmap;
308 while (cinfo.output_scanline < cinfo.output_height) {
309 jpeg_read_scanlines(&cinfo, buffer, 1);
310 for (
unsigned int i = 0; i < width; ++i) {
311 *(output++) = buffer[0][i * 3];
312 *(output++) = buffer[0][i * 3 + 1];
313 *(output++) = buffer[0][i * 3 + 2];
319 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
322 while (cinfo.output_scanline < cinfo.output_height) {
323 unsigned int row = cinfo.output_scanline;
324 jpeg_read_scanlines(&cinfo, buffer, 1);
325 memcpy(Ig[row], buffer[0], rowbytes);
331 jpeg_finish_decompress(&cinfo);
332 jpeg_destroy_decompress(&cinfo);
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Error that can be emitted by the vpImage class and its derivatives.
unsigned int getWidth() const
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
Type * bitmap
points toward the bitmap
unsigned int getHeight() const