我拦截数据包并提取有效负载。该有效载荷是压缩的jpeg字节流数据(例如,该数据被分配给unsigned char *payload
)。我知道如果我有一个FILE指针,那么我可以使用libjpeg库来提取图像信息。我的问题是有一种方法可以将指针(*payload
)传递给libjpeg函数以获取RGB值和图像的尺寸吗?
谢谢。
答案 0 :(得分:3)
要添加到Tal's answer,您应该做的是查看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()
来初始化数据源管理器,然后你应该好像从文件系统解码文件一样。
答案 1 :(得分:3)
回复:亚当罗森菲尔德的回答,你不必自己实施任何东西:jpeg_mem_src()
会做你想做的事情:
jpeg_mem_src(&cinfo, payload, payload_len);
您必须将整个图像存储在内存中(并知道其长度)。
obStackoverflow:我知道,这是一个非常古老的问题的答案,但今天我必须做到这一点,这个页面是第一个或第二个响应我的网络搜索排名。答案 2 :(得分:0)
libjpeg具有输入/输出管理器,可以扩展为使用原始内存缓冲区或任何其他形式的I / O,但AFAIK只有FILE *实际上是在库的版本中实现的。
答案 3 :(得分:0)
最近构建的libjpeg jpeg_mem_src
已经为您实现。
为windows编译libjpeg非常容易。
下载source from the project webpage
提取单个文件夹中的所有内容
然后open a Visual Studio 10 command prompt到该目录
输入
nmake /f makefile.vc setup-v10
这将创建一个将在VS2010中打开的.sln文件。它应该从那里编译。
之后您也可以调试libjpeg源代码。