41 #include "vpImageIoBackend.h" 42 #include <visp3/core/vpImageConvert.h> 44 #if defined(VISP_HAVE_JPEG) 54 #if defined(VISP_HAVE_JPEG) 66 struct jpeg_compress_struct cinfo;
67 struct jpeg_error_mgr jerr;
70 cinfo.err = jpeg_std_error(&jerr);
71 jpeg_create_compress(&cinfo);
74 if (filename.empty()) {
78 file = fopen(filename.c_str(),
"wb");
87 jpeg_stdio_dest(&cinfo, file);
89 cinfo.image_width = width;
90 cinfo.image_height = height;
91 cinfo.input_components = 1;
92 cinfo.in_color_space = JCS_GRAYSCALE;
93 jpeg_set_defaults(&cinfo);
94 jpeg_set_quality(&cinfo, quality, TRUE);
96 jpeg_start_compress(&cinfo, TRUE);
99 line =
new unsigned char[width];
100 unsigned char *input = (
unsigned char *)I.
bitmap;
101 while (cinfo.next_scanline < cinfo.image_height) {
102 for (
unsigned int i = 0; i < width; i++) {
106 jpeg_write_scanlines(&cinfo, &line, 1);
109 jpeg_finish_compress(&cinfo);
110 jpeg_destroy_compress(&cinfo);
123 void writeJPEGLibjpeg(
const vpImage<vpRGBa> &I,
const std::string &filename,
int quality)
125 struct jpeg_compress_struct cinfo;
126 struct jpeg_error_mgr jerr;
129 cinfo.err = jpeg_std_error(&jerr);
130 jpeg_create_compress(&cinfo);
133 if (filename.empty()) {
137 file = fopen(filename.c_str(),
"wb");
146 jpeg_stdio_dest(&cinfo, file);
148 cinfo.image_width = width;
149 cinfo.image_height = height;
150 cinfo.input_components = 3;
151 cinfo.in_color_space = JCS_RGB;
152 jpeg_set_defaults(&cinfo);
153 jpeg_set_quality(&cinfo, quality, TRUE);
155 jpeg_start_compress(&cinfo, TRUE);
158 line =
new unsigned char[3 * width];
159 unsigned char *input = (
unsigned char *)I.
bitmap;
160 while (cinfo.next_scanline < cinfo.image_height) {
161 for (
unsigned int i = 0; i < width; i++) {
162 line[i * 3] = *(input);
164 line[i * 3 + 1] = *(input);
166 line[i * 3 + 2] = *(input);
170 jpeg_write_scanlines(&cinfo, &line, 1);
173 jpeg_finish_compress(&cinfo);
174 jpeg_destroy_compress(&cinfo);
196 struct jpeg_decompress_struct cinfo;
197 struct jpeg_error_mgr jerr;
200 cinfo.err = jpeg_std_error(&jerr);
201 jpeg_create_decompress(&cinfo);
204 if (filename.empty()) {
208 file = fopen(filename.c_str(),
"rb");
214 jpeg_stdio_src(&cinfo, file);
215 jpeg_read_header(&cinfo, TRUE);
217 unsigned int width = cinfo.image_width;
218 unsigned int height = cinfo.image_height;
223 jpeg_start_decompress(&cinfo);
225 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
226 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
228 if (cinfo.out_color_space == JCS_RGB) {
230 unsigned char *output = (
unsigned char *)Ic.bitmap;
231 while (cinfo.output_scanline < cinfo.output_height) {
232 jpeg_read_scanlines(&cinfo, buffer, 1);
233 for (
unsigned int i = 0; i < width; i++) {
234 *(output++) = buffer[0][i * 3];
235 *(output++) = buffer[0][i * 3 + 1];
236 *(output++) = buffer[0][i * 3 + 2];
243 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
244 while (cinfo.output_scanline < cinfo.output_height) {
245 unsigned int row = cinfo.output_scanline;
246 jpeg_read_scanlines(&cinfo, buffer, 1);
247 memcpy(I[row], buffer[0], rowbytes);
251 jpeg_finish_decompress(&cinfo);
252 jpeg_destroy_decompress(&cinfo);
276 struct jpeg_decompress_struct cinfo;
277 struct jpeg_error_mgr jerr;
280 cinfo.err = jpeg_std_error(&jerr);
281 jpeg_create_decompress(&cinfo);
284 if (filename.empty()) {
288 file = fopen(filename.c_str(),
"rb");
294 jpeg_stdio_src(&cinfo, file);
296 jpeg_read_header(&cinfo, TRUE);
298 unsigned int width = cinfo.image_width;
299 unsigned int height = cinfo.image_height;
304 jpeg_start_decompress(&cinfo);
306 unsigned int rowbytes = cinfo.output_width * (
unsigned int)(cinfo.output_components);
307 JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, rowbytes, 1);
309 if (cinfo.out_color_space == JCS_RGB) {
310 unsigned char *output = (
unsigned char *)I.
bitmap;
311 while (cinfo.output_scanline < cinfo.output_height) {
312 jpeg_read_scanlines(&cinfo, buffer, 1);
313 for (
unsigned int i = 0; i < width; i++) {
314 *(output++) = buffer[0][i * 3];
315 *(output++) = buffer[0][i * 3 + 1];
316 *(output++) = buffer[0][i * 3 + 2];
322 else if (cinfo.out_color_space == JCS_GRAYSCALE) {
325 while (cinfo.output_scanline < cinfo.output_height) {
326 unsigned int row = cinfo.output_scanline;
327 jpeg_read_scanlines(&cinfo, buffer, 1);
328 memcpy(Ig[row], buffer[0], rowbytes);
334 jpeg_finish_decompress(&cinfo);
335 jpeg_destroy_decompress(&cinfo);
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
Type * bitmap
points toward the bitmap
Error that can be emited by the vpImage class and its derivates.
unsigned int getHeight() const
unsigned int getWidth() const