【发布时间】:2015-08-11 00:17:27
【问题描述】:
所以我一直在阅读 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经验的人知道如何做到这一点?
【问题讨论】:
-
您可以选择使用 libjpeg-turbo 吗? sourceforge.net/projects/libjpeg-turbo -- 如果是这样,那么 jpeg_mem_src() 方法对我来说就可以了。
-
是的,如果你能用它写一个答案;我会接受的。
-
@SamVarshavchik 你知道吗?这是因为我设置了
cinfo.src之前jpeg_create_decompress。如果我之后设置它,一切都会像黄油一样顺利:L