#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;
}