39 #include "vpImageIoBackend.h"
40 #include <visp3/core/vpImageConvert.h>
42 #if defined(VISP_HAVE_JPEG)
51 #if defined(VISP_HAVE_JPEG)
64 struct jpeg_compress_struct cinfo;
65 struct jpeg_error_mgr jerr;
68 cinfo.err = jpeg_std_error(&jerr);
69 jpeg_create_compress(&cinfo);
72 if (filename.empty()) {
76 file = fopen(filename.c_str(),
"wb");
78 if (file ==
nullptr) {
85 jpeg_stdio_dest(&cinfo, file);
87 cinfo.image_width = width;
88 cinfo.image_height = height;
89 cinfo.input_components = 1;
90 cinfo.in_color_space = JCS_GRAYSCALE;
91 jpeg_set_defaults(&cinfo);
92 jpeg_set_quality(&cinfo, quality, TRUE);
94 jpeg_start_compress(&cinfo, TRUE);
97 line =
new unsigned char[width];
98 unsigned char *input = (
unsigned char *)I.
bitmap;
99 while (cinfo.next_scanline < cinfo.image_height) {
100 for (
unsigned int i = 0; i < width; ++i) {
104 jpeg_write_scanlines(&cinfo, &line, 1);
107 jpeg_finish_compress(&cinfo);
108 jpeg_destroy_compress(&cinfo);
121 void writeJPEGLibjpeg(
const vpImage<vpRGBa> &I,
const std::string &filename,
int quality)
123 struct jpeg_compress_struct cinfo;
124 struct jpeg_error_mgr jerr;
127 cinfo.err = jpeg_std_error(&jerr);
128 jpeg_create_compress(&cinfo);
131 if (filename.empty()) {
135 file = fopen(filename.c_str(),
"wb");
137 if (file ==
nullptr) {
144 jpeg_stdio_dest(&cinfo, file);
146 cinfo.image_width = width;
147 cinfo.image_height = height;
148 cinfo.input_components = 3;
149 cinfo.in_color_space = JCS_RGB;
150 jpeg_set_defaults(&cinfo);
151 jpeg_set_quality(&cinfo, quality, TRUE);
153 jpeg_start_compress(&cinfo, TRUE);
156 line =
new unsigned char[3 * width];
157 unsigned char *input = (
unsigned char *)I.
bitmap;
158 while (cinfo.next_scanline < cinfo.image_height) {
159 for (
unsigned int i = 0; i < width; ++i) {
160 line[i * 3] = *(input);
162 line[i * 3 + 1] = *(input);
164 line[i * 3 + 2] = *(input);
168 jpeg_write_scanlines(&cinfo, &line, 1);
171 jpeg_finish_compress(&cinfo);
172 jpeg_destroy_compress(&cinfo);
194 struct jpeg_decompress_struct cinfo;
195 struct jpeg_error_mgr jerr;
198 cinfo.err = jpeg_std_error(&jerr);
199 jpeg_create_decompress(&cinfo);
202 if (filename.empty()) {
206 file = fopen(filename.c_str(),
"rb");
208 if (file ==
nullptr) {
212 jpeg_stdio_src(&cinfo, file);
213 jpeg_read_header(&cinfo, TRUE);
215 unsigned int width = cinfo.image_width;
216 unsigned int height = cinfo.image_height;
221 jpeg_start_decompress(&cinfo);
223 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
224 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
226 if (cinfo.out_color_space == JCS_RGB) {
228 unsigned char *output = (
unsigned char *)Ic.bitmap;
229 while (cinfo.output_scanline < cinfo.output_height) {
230 jpeg_read_scanlines(&cinfo, buffer, 1);
231 for (
unsigned int i = 0; i < width; ++i) {
232 *(output++) = buffer[0][i * 3];
233 *(output++) = buffer[0][i * 3 + 1];
234 *(output++) = buffer[0][i * 3 + 2];
241 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
242 while (cinfo.output_scanline < cinfo.output_height) {
243 unsigned int row = cinfo.output_scanline;
244 jpeg_read_scanlines(&cinfo, buffer, 1);
245 memcpy(I[row], buffer[0], rowbytes);
249 jpeg_finish_decompress(&cinfo);
250 jpeg_destroy_decompress(&cinfo);
274 struct jpeg_decompress_struct cinfo;
275 struct jpeg_error_mgr jerr;
278 cinfo.err = jpeg_std_error(&jerr);
279 jpeg_create_decompress(&cinfo);
282 if (filename.empty()) {
286 file = fopen(filename.c_str(),
"rb");
288 if (file ==
nullptr) {
292 jpeg_stdio_src(&cinfo, file);
294 jpeg_read_header(&cinfo, TRUE);
296 unsigned int width = cinfo.image_width;
297 unsigned int height = cinfo.image_height;
302 jpeg_start_decompress(&cinfo);
304 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
305 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
307 if (cinfo.out_color_space == JCS_RGB) {
308 unsigned char *output = (
unsigned char *)I.
bitmap;
309 while (cinfo.output_scanline < cinfo.output_height) {
310 jpeg_read_scanlines(&cinfo, buffer, 1);
311 for (
unsigned int i = 0; i < width; ++i) {
312 *(output++) = buffer[0][i * 3];
313 *(output++) = buffer[0][i * 3 + 1];
314 *(output++) = buffer[0][i * 3 + 2];
320 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
323 while (cinfo.output_scanline < cinfo.output_height) {
324 unsigned int row = cinfo.output_scanline;
325 jpeg_read_scanlines(&cinfo, buffer, 1);
326 memcpy(Ig[row], buffer[0], rowbytes);
332 jpeg_finish_decompress(&cinfo);
333 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