Libjpeg将图像写入内存数据

时间:2014-10-01 14:27:33

标签: c++ libjpeg

我想使用libjpeg库将图像保存到内存(矢量)中。 我发现了那些功能:

init_destination
empty_output_buffer 
term_destination

我的问题是如何在并行程序中安全正确地完成它?我的函数可以从不同的线程执行。 我想在c ++和Visual Studio 2010中完成它。

具有回调功能的其他库总是具有附加功能参数来存储一些附加数据。 我没有看到任何添加任何其他参数的方法,例如指向我本地矢量实例的指针。

修改 mmy问题的好方法是:http://www.christian-etter.de/?cat=48

1 个答案:

答案 0 :(得分:2)

这里描述了一个很好的解决方案:http://www.christian-etter.de/?cat=48

typedef struct _jpeg_destination_mem_mgr
{
    jpeg_destination_mgr mgr;
    std::vector<unsigned char> data;
} jpeg_destination_mem_mgr;

初​​始化:

static void mem_init_destination( j_compress_ptr cinfo )
{
    jpeg_destination_mem_mgr* dst = (jpeg_destination_mem_mgr*)cinfo->dest;
    dst->data.resize( JPEG_MEM_DST_MGR_BUFFER_SIZE );
    cinfo->dest->next_output_byte = dst->data.data();
    cinfo->dest->free_in_buffer = dst->data.size();
}

当我们完成后,我们需要将缓冲区大小调整为实际大小:

static void mem_term_destination( j_compress_ptr cinfo )
{
    jpeg_destination_mem_mgr* dst = (jpeg_destination_mem_mgr*)cinfo->dest;
    dst->data.resize( dst->data.size() - cinfo->dest->free_in_buffer );
}

当缓冲区大小太小时,我们需要增加它:

static boolean mem_empty_output_buffer( j_compress_ptr cinfo )
{
    jpeg_destination_mem_mgr* dst = (jpeg_destination_mem_mgr*)cinfo->dest;
    size_t oldsize = dst->data.size();
    dst->data.resize( oldsize + JPEG_MEM_DST_MGR_BUFFER_SIZE );
    cinfo->dest->next_output_byte = dst->data.data() + oldsize;
    cinfo->dest->free_in_buffer = JPEG_MEM_DST_MGR_BUFFER_SIZE;
    return true;
}

回调配置:

static void jpeg_mem_dest( j_compress_ptr cinfo, jpeg_destination_mem_mgr * dst )
{
    cinfo->dest = (jpeg_destination_mgr*)dst;
    cinfo->dest->init_destination = mem_init_destination;
    cinfo->dest->term_destination = mem_term_destination;
    cinfo->dest->empty_output_buffer = mem_empty_output_buffer;
}

样本用法:

jpeg_destination_mem_mgr dst_mem;
jpeg_compress_struct_wrapper cinfo;
j_compress_ptr pcinfo = cinfo;
jpeg_mem_dest( cinfo, &dst_mem);