libjpeg自定义源管理器

时间:2015-08-11 00:17:28

标签: 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 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;
} 

但它永远不会超过jpeg_read_header

我知道这是一个jpeg文件,我知道我的内存正在正确传递,因为我有libpng加载具有相同签名的图像并且调用函数很好,所以我确定这是我如何设置cinfo中的源代码管理器。

任何有更多libjpeg经验的人都知道怎么做?

2 个答案:

答案 0 :(得分:0)

在我的代码中,我在调用cinfo.src之前设置了jpeg_create_decompress,然后设置它修复了问题:)

答案 1 :(得分:0)

使用jpeg_mem_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... */