19 typedef unsigned char boolean;
26 #include <qfileinfo.h> 37 #include "../imageTools.h" 49 (error->output_message)(cinfo);
55 int targetWidth,
int targetHeight)
58 struct jpeg_decompress_struct cinfo;
61 FILE* inputFile=fopen( fileIn.ascii(),
"rb" );
62 if(!inputFile)
return false;
66 cinfo.err = jpeg_std_error(&jerr);
70 jpeg_destroy_decompress(&cinfo);
76 jpeg_create_decompress(&cinfo);
77 jpeg_stdio_src(&cinfo, inputFile);
78 jpeg_read_header(&cinfo, TRUE);
81 int origWidth = (int)cinfo.image_width;
82 int origHeight = (
int)cinfo.image_height;
87 if( origWidth > targetWidth || origHeight > targetHeight )
90 ( origWidth / (denom*2) >= targetWidth || origHeight / (denom*2) >= targetHeight )
97 cinfo.scale_denom=denom;
100 jpeg_start_decompress(&cinfo);
102 switch(cinfo.output_components)
107 scaledImage.create( cinfo.output_width, cinfo.output_height, 8, 256 );
108 for (
int i=0; i<256; i++)
110 scaledImage.setColor(i, qRgb(i,i,i));
118 scaledImage.create( cinfo.output_width, cinfo.output_height, 32 );
123 jpeg_destroy_decompress(&cinfo);
129 uchar** lines = scaledImage.jumpTable();
130 while (cinfo.output_scanline < cinfo.output_height)
132 jpeg_read_scanlines(&cinfo, lines + cinfo.output_scanline, cinfo.output_height);
134 jpeg_finish_decompress(&cinfo);
138 if ( cinfo.output_components == 1 )
140 scaledImage = scaledImage.convertDepth( 32, Qt::AutoColor );
144 if ( cinfo.output_components == 3 )
146 for (uint j=0; j<cinfo.output_height; j++)
148 uchar *in = scaledImage.scanLine(j) + cinfo.output_width*3;
149 QRgb *out = (QRgb*)( scaledImage.scanLine(j) );
151 for (uint i=cinfo.output_width; i--; )
154 out[i] = qRgb(in[0], in[1], in[2]);
160 if( scaledImage.width() != targetWidth || scaledImage.height() != targetHeight )
162 int clampedTargetWidth = targetWidth;
163 int clampedTargetHeight = targetHeight;
165 if(QMIN( ((
float)targetWidth)/origWidth, ((
float)targetHeight)/origHeight ) > 2)
167 clampedTargetWidth = 2*origWidth;
168 clampedTargetHeight = 2*origHeight;
171 scaledImage = scaledImage.smoothScale(clampedTargetWidth, clampedTargetHeight, Qt::KeepAspectRatio);
173 jpeg_destroy_decompress(&cinfo);
180 struct jpeg_decompress_struct srcinfo;
181 struct jpeg_compress_struct dstinfo;
186 jvirt_barray_ptr * src_coef_arrays;
187 jvirt_barray_ptr * dst_coef_arrays;
191 switch( transformation )
208 transformoption.
trim = TRUE;
212 srcinfo.err = jpeg_std_error(&jsrcerr);
213 jpeg_create_decompress(&srcinfo);
216 dstinfo.err = jpeg_std_error(&jdsterr);
217 jpeg_create_compress(&dstinfo);
221 dstinfo.err->trace_level = 0;
222 jsrcerr.trace_level = jdsterr.trace_level;
223 srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;
227 if ((input_file = fopen(QFile::encodeName(fileIn),
"rb")) == NULL)
return false;
228 if ((output_file = fopen(QFile::encodeName(fileOut),
"wb")) == NULL)
return false;
231 jpeg_stdio_src(&srcinfo, input_file);
237 (void) jpeg_read_header(&srcinfo, TRUE);
244 src_coef_arrays = jpeg_read_coefficients(&srcinfo);
247 jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
255 jpeg_stdio_dest(&dstinfo, output_file);
258 jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
269 jpeg_finish_compress(&dstinfo);
270 jpeg_destroy_compress(&dstinfo);
271 (void) jpeg_finish_decompress(&srcinfo);
272 jpeg_destroy_decompress(&srcinfo);
static void handler(j_common_ptr cinfo)
void jcopy_markers_setup(j_decompress_ptr srcinfo, JCOPY_OPTION option)
void jcopy_markers_execute(j_decompress_ptr srcinfo, j_compress_ptr dstinfo)
jvirt_barray_ptr * jtransform_adjust_parameters(j_compress_ptr dstinfo, jvirt_barray_ptr *src_coef_arrays, jpeg_transform_info *info)
void jtransform_request_workspace(j_decompress_ptr srcinfo, jpeg_transform_info *info)
void jtransform_execute_transformation(j_decompress_ptr srcinfo, j_compress_ptr dstinfo, jvirt_barray_ptr *src_coef_arrays, jpeg_transform_info *info)