Ho trovato questa funzione che libjpeg utilizza per scrivere in un file:Scrive sul buffer di memoria invece del file con libjpeg?
int write_jpeg_file(char *filename)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
/* this is a pointer to one row of image data */
JSAMPROW row_pointer[1];
FILE *outfile = fopen(filename, "wb");
if (!outfile)
{
printf("Error opening output jpeg file %s\n!", filename);
return -1;
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
/* Setting the parameters of the output file here */
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = bytes_per_pixel;
cinfo.in_color_space = color_space;
/* default compression parameters, we shouldn't be worried about these */
jpeg_set_defaults(&cinfo);
/* Now do the compression .. */
jpeg_start_compress(&cinfo, TRUE);
/* like reading a file, this time write one row at a time */
while(cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = &raw_image[ cinfo.next_scanline * cinfo.image_width * cinfo.input_components];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
/* similar to read file, clean up after we're done compressing */
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
fclose(outfile);
/* success code is 1! */
return 1;
}
vorrei davvero bisogno di scrivere l'immagine JPEG compressa solo per buffer di memoria, senza salvarlo in un file, per risparmiare tempo. Qualcuno potrebbe darmi un esempio su come farlo?
Sono stato a cercare sul Web per un po ', ma la documentazione è molto rara se c'è ne ed alcuni esempi sono anche difficili da trovare.
Immagino che questi puntatori di funzione siano ciò che influenza 'jpeg_stdio_dest'? –
@Ben Voigt, guardando il sorgente di 'jpeg_stdio_dest' è esattamente quello che fa. Alloca una struttura e la imposta in 'cinfo-> dest', quindi imposta i puntatori.Sto pensando che il mio codice di esempio potrebbe essere un po 'incompleto dal momento che non crea una struttura 'jpeg_destination_mgr', ma lo esaminerò più avanti. –
Oh, certo. Puoi [memorizzare i tuoi dati ('std :: vector') immediatamente dopo i puntatori di funzione e non hanno bisogno di variabili globali] (http://blogs.msdn.com/b/oldnewthing/archive/2010/12/20/ 10107027.aspx). –