323 a_out <<
"tools::jpeg::read_part :"
324 <<
" file " << a_file <<
" is not jpeg."
332 FILE* file = ::fopen(a_file.c_str(),
"rb");
334 a_out <<
"tools::jpeg::read_part :"
335 <<
" can't open " << a_file
343 struct jpeg_decompress_struct cinfo;
344 struct error_mgr jerr;
346 cinfo.err = ::jpeg_std_error(&jerr.pub);
348 if(::setjmp(jerr.setjmp_buffer)) {
358 ::jpeg_create_decompress(&cinfo);
359 ::jpeg_stdio_src(&cinfo,file);
360 ::jpeg_read_header(&cinfo,TRUE);
362 ::jpeg_start_decompress(&cinfo);
364 int row_stride = cinfo.output_width * cinfo.output_components;
366 unsigned int w = cinfo.output_width;
367 unsigned int h = cinfo.output_height;
369 if((a_sx>=w)||(a_sy>=h)){
370 ::jpeg_abort_decompress(&cinfo);
371 ::jpeg_destroy_decompress(&cinfo);
380 a_rw = tools::mn<unsigned int>(w-a_sx,a_sw);
381 a_rh = tools::mn<unsigned int>(h-a_sy,a_sh);
382 a_rbpp = cinfo.output_components;
384 if(!a_rw||!a_rh||!a_rbpp){
385 ::jpeg_abort_decompress(&cinfo);
386 ::jpeg_destroy_decompress(&cinfo);
394 unsigned char* image_buffer =
new unsigned char[a_rw*a_rh*a_rbpp];
396 ::jpeg_abort_decompress(&cinfo);
397 ::jpeg_destroy_decompress(&cinfo);
405 unsigned char* line =
new unsigned char[row_stride];
407 ::jpeg_abort_decompress(&cinfo);
408 ::jpeg_destroy_decompress(&cinfo);
410 delete [] image_buffer;
419 unsigned int hbeg = a_sy;
420 unsigned int hend = a_sy+a_rh;
424 unsigned char* pos = image_buffer+a_rh*a_rw*a_rbpp;
425 while(cinfo.output_scanline<cinfo.output_height) {
426 if(jpeg_read_scanlines(&cinfo, buffer, 1)!=1) {
427 ::jpeg_abort_decompress(&cinfo);
428 ::jpeg_destroy_decompress(&cinfo);
431 delete [] image_buffer;
437 if((hbeg<=cinfo.output_scanline)&&(cinfo.output_scanline<hend)){
439 ::memcpy(pos,line+a_sx*a_rbpp,a_rw*a_rbpp);
443 if(cinfo.output_scanline<cinfo.output_height)
444 ::jpeg_abort_decompress(&cinfo);
446 ::jpeg_finish_decompress(&cinfo);
448 ::jpeg_destroy_decompress(&cinfo);