gpt4 book ai didi

c++ - libjpeg 自定义源管理器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:23 25 4
gpt4 key购买 nike

所以我一直在阅读 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 方面有更多经验的人知道该怎么做吗?

最佳答案

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

关于c++ - libjpeg 自定义源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31931186/

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