gpt4 book ai didi

c++ - libjpeg 将图像写入内存数据

转载 作者:行者123 更新时间:2023-11-30 04:00:45 29 4
gpt4 key购买 nike

我想使用 libjpeg 库将图像保存到内存( vector )中。我发现那里有功能:

init_destination
empty_output_buffer
term_destination

我的问题是如何在并行程序中安全、正确地做到这一点?我的功能可能从不同的线程执行。我想在 C++ 和 Visual Studio 2010 中完成。

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

编辑:mmy问题的好解决方案在这里:http://www.christian-etter.de/?cat=48

最佳答案

此处描述了不错的解决方案: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);

关于c++ - libjpeg 将图像写入内存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26143726/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com