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");
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);
120void 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");
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");
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");
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.
Definition of the vpImage class member functions.
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