我拦截一个数据包并提取有效负载。此有效负载是压缩的 jpeg 字节流数据(例如,此数据分配给unsigned char *payload
)。我知道如果我有一个 FILE 指针,那么我可以使用 libjpeg 库来提取图像信息。我的问题是有没有办法将我的指针(*payload
)传递给 libjpeg 函数以获取 RGB 值和图像的尺寸?
谢谢你。
回复:亚当罗森菲尔德的回答,你不必自己实现任何东西:jpeg_mem_src()
会做你想做的事:
jpeg_mem_src(&cinfo, payload, payload_len);
您必须将整个图像存储在内存中(并知道它的长度)。
obStackoverflow:我知道,一个非常老的问题的答案,但今天我必须这样做,这个页面在我的网络搜索中排名第一或第二。
要添加到Tal 的答案,您应该做的是查看jpeg_stdio_src()
函数的实现jdatasrc.c
。该函数的目的是初始化数据源对象,即cinfo->src
. 所以,你应该做的是以下几点:
创建一个结构(类似于 中的my_source_mgr
结构jdatasrc.c
),它的第一个成员是struct jpeg_source_mgr
. 添加您认为必要的任何其他成员。请注意,我们实际上是在进行手动继承——在 C++ 中,我们将定义一个派生自 的类jpeg_source_mgr
,而在其中声明的各种函数指针jpeg_source_mgr
将改为虚函数。但是,我们使用的是 C,所以我们必须以艰难的方式进行继承和多态。
为结构实例分配空间,确保分配正确的字节数,并填写数据成员。
实现以下五个功能:
void init_source(j_decompress_ptr)
boolean fill_input_buffer(j_decompress_ptr)
void skip_input_data(j_decompress_ptr, long)
boolean resync_to_start(j_decompress_ptr, int)
void term_source(j_decompress_ptr)
请注意,对于内存缓冲区,这些函数可能非常微不足道。
最后,初始化jpeg_source_mgr
成员中的函数指针以指向这些函数。
有了这个,您就可以使用它而不是jpeg_stdio_src()
初始化数据源管理器,然后您就可以像从文件系统中解码文件一样进行操作了。
在最近的 libjpeg 版本中,jpeg_mem_src
已经为您实现了。
为 windows 编译 libjpeg 非常容易。
从项目网页下载源代码 将
所有内容提取到一个文件夹中
然后打开 Visual Studio 10 命令提示符到该目录
类型
nmake /f makefile.vc setup-v10
这将创建一个 .sln 文件,该文件将在 VS2010 中打开。它应该从那里编译。
之后您也可以调试 libjpeg 源代码。
libjpeg 具有输入/输出管理器,可以扩展为使用原始内存缓冲区或您拥有的任何其他形式的 I/O,但 AFAIK 只有 FILE* 实际上在库的版本中实现。