He encontrado esta función que utiliza libjpeg escribir en un archivo:Escribir en el búfer de memoria en lugar de archivo 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;
}
De hecho, me tiene que escribir la imagen JPEG comprimido sólo para búfer de memoria, sin guardar en un archivo, para ahorrar tiempo. ¿Alguien podría darme un ejemplo de cómo hacerlo?
He estado buscando en la web por un tiempo, pero la documentación es muy rara si hay alguna y los ejemplos también son difíciles de encontrar.
Imagino que estos indicadores de función son a lo que 'jpeg_stdio_dest' afecta? –
@Ben Voigt, mirando la fuente a 'jpeg_stdio_dest' eso es exactamente lo que hace. Asigna una estructura y la establece en 'cinfo-> dest', luego establece los punteros.Creo que mi propio código de muestra puede estar un poco incompleto ya que no crea una estructura 'jpeg_destination_mgr', pero lo investigaré más adelante. –
Oh, por supuesto. Puede [almacenar sus propios datos (el 'std :: vector'] inmediatamente después de los punteros a la función y no necesita variables globales] (http://blogs.msdn.com/b/oldnewthing/archive/2010/12/20/ 10107027.aspx). –