如何使用jpeg_mem_dest使用libjpeg-turbo压缩到内存

时间:2016-11-10 23:57:11

标签: c++ libjpeg libjpeg-turbo

我尝试过关注another answer,但似乎无法做到这一点。我有大约8MiB的RBGX位图使用libjpeg-turbo转换为内存中的jpeg。如果我使用Ren "Test.txt" "161109-Mike-Smith-4719.txt" 我可以将整个内容写入文件,然后重新读取文件,就可以了。但是,尝试使用jpeg_stdio_dest一直是个难题。我的设置与jpeg_mem_dest完全相同,但使用jpeg_stdio_dest似乎只进行一次4KiB分配,然后再分配更多空间。

我无法找到有关如何使用mem的进一步说明的文档,并且可以真正使用某些方向。

jpeg_mem_dest

1 个答案:

答案 0 :(得分:2)

是的,这根本不直观。提出jpeg_mem_dest()调整的程序员没有太多选择,扩展现有的api并不是那么容易,因为它不是为了首先支持一个功能而设计的。什么是完全不明显的是你的变量不会更新,直到之后 jpeg_finish_compress()调用。库中的相关代码是:

METHODDEF(void)
term_mem_destination (j_compress_ptr cinfo)
{
  my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;

  *dest->outbuffer = dest->buffer;
  *dest->outsize = (unsigned long)(dest->bufsize - dest->pub.free_in_buffer);
}

注意单词" term"。该函数通过函数指针间接调用:

GLOBAL(void)
jpeg_finish_compress (j_compress_ptr cinfo)
{
  //...
  /* Write EOI, do final cleanup */
  (*cinfo->marker->write_file_trailer) (cinfo);
  (*cinfo->dest->term_destination) (cinfo);
  //...
}

你无能为力。只需调整你的std :: cout代码,在循环之后移动它以适应库的工作方式。

要注意这个功能的其他细节,也不是很明显。你必须释放()它创建的缓冲区。在提供的cjpeg.c示例程序中可见,main()的结尾。