如何在有和没有std :: vector的情况下正确使用jpeg_mem_dest

时间:2016-08-27 11:13:48

标签: c++ c c++11 jpeg libjpeg

我在搜索如何写入缓冲区而不是文件时遇到了这个问题,但我找不到一个好的例子。

这是jpeglib.h所说的,但我不确定如何使用它。

/* Data source and destination managers: memory buffers. */
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
                   unsigned char ** outbuffer,
                   unsigned long * outsize));

example.c 中,我们将数据目标设置为 第2步 ,那么如何使用此功能这里,如果我们已经有一个std::vector<unsigned char> buffer来保存RGB值。

/* Step 2: specify data destination (eg, a file) */
/* Note: steps 2 and 3 can be done in either order. */
    jpeg_mem_dest(&cinfo, /*WHAT GOES HERE*/, /*WHAT GOES HERE*/);

完成此操作后,我们对 第5步 进行了哪些更改,以便我们写入 相同的 缓冲区,我们的解压缩RGB值是什么?

/* Step 5: while (scan lines remain to be written) */
/*           jpeg_write_scanlines(...); */

我错过了什么吗?我非常感谢任何帮助,谢谢你。

2 个答案:

答案 0 :(得分:0)

您必须查看文档。 但是outbuffer是一个未签名的char **。所以几乎可以肯定的功能 将调用malloc,然后设置outbuffer到结果。

unsigned char *rgba;
unsigned long size;
std::vector<unsigned char> buffer.
jpeg_mem_dest(jpegdata, &rgba, &size);
if(size > 0)
{
   buffer.resize(size);
   for(i=0;i<size;i++)
     buffer[i] = rgba[i];
   free(rgba);
}

致电

pointer-events:none

答案 1 :(得分:0)

假设您继续前进,但以下内容适用于其他正在寻找的人。

struct Result{
  unsigned char* buf;
  unsigned long size;
}
Result result;
// ..Here allocate the buffer and initialize the size
// before using in jpeg_mem_dest.  Or it will allocate for you
// and you have to clean up.
jpeg_mem_dest(&cinfo, &result->buf, &result->size);
// use buffer
free(result->buf); // <- of course depending on the way the buffer was allocated 

如果您使用的是std :: vector,则自c ++ 11起,您可以使用&myVec [0]或myVec.data()之类的东西来传递原始缓冲区(但我可能对此有麻烦) )。一种解决方法是使用原始缓冲区,如果对性能不重要,则仅复制/插入。

// Copy based.  Could also just buffer.insert if not preallocated using resize.
std::vector<unsigned char> buffer;
budder.resize(result->size())
std::copy(result->buf
        , result->buf + result->size
        , buffer.begin());