Import issue:
This example code is for Linux ( or possible for MacOSX ).
and .. Fixed some wrong code
Makefile
It must be declared to link with jpeg library in system, or it should not be switched with turbo-jpeg.
LFLAGS += -ljpeg
Code for jpeglib.
#include <jpeglib.h>
int writejpeg( const char* fname, unsigned char *src, size_t w, size_t h, size_t d, unsigned qual = 100 )
{
FILE* outf = NULL;
struct jpeg_compress_struct jcs = {0};
struct jpeg_error_mgr jem = {0};
JSAMPROW row_pointer[1];
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
jcs.image_width = w;
jcs.image_height = h;
jcs.input_components = d;
switch( d )
{
case 1:
jcs.in_color_space = JCS_GRAYSCALE;
break;
case 3:
jcs.in_color_space = JCS_RGB;
break;
default:
return -1;
}
outf = fopen( fname,"wb" );
if ( outf == NULL )
return -2;
jpeg_stdio_dest(&jcs, outf);
if ( qual > 100 ) qual = 100;
else
if ( qual == 0 ) qual = 10;
jpeg_set_defaults(&jcs);
jpeg_set_quality(&jcs, qual, TRUE);
jpeg_start_compress(&jcs, TRUE);
while( jcs.next_scanline < jcs.image_height )
{
row_pointer[0] = &src[ jcs.next_scanline *
jcs.image_width *
jcs.input_components ];
jpeg_write_scanlines( &jcs, row_pointer, 1 );
}
jpeg_finish_compress(&jcs);
jpeg_destroy_compress(&jcs);
fclose(out);
return 0;
}
Code for TURBOJPEG
LFLAGS += -lturbojpeg
#include <turbojpeg.h>
int writejpeg( const char* fname, unsigned char* src, size_t w, size_t h, size_t d, unsigned qual = 100 )
{
unsigned long jsz = 0;
int jfmt = 0;
int jsmp = 0;
switch( d )
{
case 1:
jfmt = TJPF_GRAY;
jsmp = TJSAMP_GRAY;
break;
case 2:
return -1;
case 3:
jfmt = TJPF_RGB;
jsmp = TJSAMP_444;
break;
case 4:
jfmt = TJPF_RGBA;
jsmp = TJSAMP_444;
break;
}
if ( qual > 100 ) qual = 100;
else
if ( qual == 0 ) qual = 10;
uchar* outbuff = NULL;
thandle jComp = tjInitCompress();
if ( jComp != NULL )
{
tjCompress2( jComp,
src,
w,
0,
h,
jfmt,
&outbuff,
&jsz,
TJSAMP_444,
qual,
TJFLAG_FASTDCT );
tjDestroy( jComp );
if ( jsz > 0 )
{
FILE* outf = fopen( fname, "wb" );
if ( outf != NULL )
{
fwrite( outbuff, 1, jsz, outf );
fclose( outf );
delete[] outbuff;
return 0;
}
else
{
delete[] outbuff;
}
}
}
return -1;
}Using case for FLTK RGB image
bool WriteImage2JPEG( Fl_RGB_Image* img, const char* fn )
{
if ( ( img != NULL ) && ( fn != NULL ) )
{
uchar* pRef = (uchar*)pRef->data()[0];
int ret = writejpeg( fn, pRef, img->w(), img->h(), img->d(), 81 );
if ( ret == 0 )
return true;
}
return false;
}