C++ libjpeg自定义源管理器

C++ libjpeg自定义源管理器,c++,libjpeg,C++,Libjpeg,所以我一直在阅读libjpeg文档,它非常平淡 我一直在试图找出如何从自定义内存缓冲区而不是文件中读取数据,甚至不知道如何测试我的解决方案是否正常工作 目前,我从内存加载jpeg的功能如下: struct error_mgr{ jpeg_error_mgr pub; std::jmp_buf buf; }; bool load_jpeg(void *mem, size_t size, output_struct &output){ jpeg_source_mgr

所以我一直在阅读libjpeg文档,它非常平淡

我一直在试图找出如何从自定义内存缓冲区而不是文件中读取数据,甚至不知道如何测试我的解决方案是否正常工作

目前,我从内存加载jpeg的功能如下:

struct error_mgr{
    jpeg_error_mgr pub;
    std::jmp_buf buf;
};

bool load_jpeg(void *mem, size_t size, output_struct &output){
    jpeg_source_mgr src;

    src.next_input_bytes = static_cast<JOCTET*>(mem)-size;
    src.bytes_in_buffer = size;

    src.init_source = [](j_compress_ptr){};

    src.fill_input_buffer = [](j_decompress_ptr cinfo) -> boolean{
        // should never reach end of buffer
        throw "libjpeg tried to read past end of file";
        return true;
    };

    src.skip_input_data = [](j_compress_ptr cinfo, long num_bytes){
        if(num_bytes < 1) return; // negative or 0 us no-op
        cinfo->src.next_input_byte+=num_bytes;
        cinfo->src.bytes_in_buffer-=num_bytes;
    };

    src.resync_to_restart = jpeg_resync_to_restart;

    src.term_source = [](j_decompress_ptr){};

    struct jpeg_decompress_struct cinfo;

    error_mgr err;
    cinfo.err = jpeg_std_error(&err.pub);
    err.pub.error_exit = [](j_common_ptr cinfo){
        error_mgr ptr = reinterpret_cast<error_mgr*>(cinfo->err);
        std::longjmp(ptr->buf, 1);
    };

    if(std::setjmp(err.buf)){
        jpeg_destroy_decompress(&cinfo);
        return false;
    }

    cinfo.src = &src;

    jpeg_create_decompress(&cinfo);

    (void) jpeg_read_header(&cinfo, TRUE);

    // do the actual reading of the image

    return true;
} 
struct error\u mgr{
jpeg\u错误\u管理发布;
标准:jmp_buf buf;
};
bool load\u jpeg(void*mem、大小、输出结构和输出){
jpeg\u源代码\u管理器src;
src.next_input_bytes=静态_cast(mem)-大小;
src.bytes_in_buffer=大小;
src.init_source=[](j_compress_ptr){};
src.fill\u input\u buffer=[](解压\u ptr cinfo)->布尔值{
//不应到达缓冲区的末端
抛出“libjpeg试图读取超过文件结尾的内容”;
返回true;
};
src.skip_input_data=[](j_compress_ptr cinfo,long num_字节){
if(num_bytes<1)返回;//负或0 us无操作
cinfo->src.next\u input\u byte+=num\u bytes;
cinfo->src.bytes\u在缓冲区中-=num\u字节;
};
src.resync_to_restart=jpeg_resync_to_restart;
src.term_source=[](j_decompresse_ptr){};
结构jpeg\u解压缩\u结构cinfo;
错误管理器错误;
cinfo.err=jpeg\u std\u error(&err.pub);
err.pub.error_exit=[](j_common_ptr cinfo){
error\u mgr ptr=reinterpret\u cast(cinfo->err);
标准:longjmp(ptr->buf,1);
};
if(std::setjmp(err.buf)){
jpeg\u destroy\u解压缩(&cinfo);
返回false;
}
cinfo.src=&src;
jpeg\u创建\u解压缩(&cinfo);
(void)jpeg_read_头(&cinfo,TRUE);
//进行图像的实际读取
返回true;
} 
但它永远不会通过jpeg\u read\u头

我知道这是一个jpeg文件,我知道我的内存被正确传递,因为我有libpng加载具有相同签名的图像并调用函数fine,所以我确信这就是我在
cinfo
中设置源代码管理器的方式


任何对libjpeg有更多经验的人都知道如何做到这一点吗?

在我的代码中,我在调用
jpeg\u create\u decompress
之前设置了
cinfo.src
,之后设置它解决了这个问题:)

使用
jpeg\u mem\u src
()对我有效,使用libjpeg-turbo:

struct jpeg_decompress_struct cinfo;

/* ... */

char *ptr;
size_t buffer;

/* Initialize ptr, buffer, then: */

jpeg_mem_src(&cinfo, ptr, buffer);

/* Now, it's time for jpeg_read_header(), etc... */

您有使用libjpeg-turbo的选项吗?--如果是这样的话,它的jpeg\u mem\u src()方法对我来说很好用;我会接受的。@SamVarshavchik你知道吗?这是因为我在
jpeg\u create\u decompress
之前设置了
cinfo.src
。如果我以后再把它调好,一切都会像黄油一样顺滑