【发布时间】:2009-05-07 04:16:46
【问题描述】:
我截获一个数据包并提取有效载荷。此有效负载是压缩的 jpeg 字节流数据(例如,此数据分配给 unsigned char *payload)。我知道如果我有一个 FILE 指针,那么我可以使用 libjpeg 库来提取图像信息。我的问题是有没有办法将我的指针(*payload)传递给 libjpeg 函数以获取 RGB 值和图像的尺寸?
谢谢。
【问题讨论】:
我截获一个数据包并提取有效载荷。此有效负载是压缩的 jpeg 字节流数据(例如,此数据分配给 unsigned char *payload)。我知道如果我有一个 FILE 指针,那么我可以使用 libjpeg 库来提取图像信息。我的问题是有没有办法将我的指针(*payload)传递给 libjpeg 函数以获取 RGB 值和图像的尺寸?
谢谢。
【问题讨论】:
回复:Adam Rosenfield 的回答,你不必自己实现任何东西:jpeg_mem_src() 会做你想做的事:
jpeg_mem_src(&cinfo, payload, payload_len);
您必须将整个图像存储在内存中(并知道它的长度)。
obStackoverflow:我知道,一个非常老的问题的答案,但今天我必须这样做,这个页面在我的网络搜索中排名第一或第二。
【讨论】:
raw_data_out 模式下工作。不断收到Improper call to JPEG library in state 205。据我所知,如果您要调用jpeg_read_raw_data(),则必须填充分配给src 成员的jpeg_source_mgr 结构的函数指针成员。
要添加到Tal's answer,你应该看一下jdatasrc.c 中jpeg_stdio_src() 函数的实现。该函数的目的是初始化数据源对象,即cinfo->src。所以,你应该做的是:
创建一个结构(类似于jdatasrc.c 中的my_source_mgr 结构),它的第一个成员是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 具有输入/输出管理器,可以扩展为使用原始内存缓冲区或您拥有的任何其他形式的 I/O,但 AFAIK 仅 FILE* 在库的版本中实际实现。
【讨论】:
在最近的 libjpeg 版本中,jpeg_mem_src 已经为您实现了。
为 windows 编译 libjpeg 非常容易。
下载source from the project webpage
将所有内容提取到一个文件夹中
然后open a Visual Studio 10 command prompt到那个目录
键入
nmake /f makefile.vc setup-v10
这将创建一个 .sln 文件,该文件将在 VS2010 中打开。它应该从那里编译。
之后您也可以调试 libjpeg 源代码。
【讨论】: