4

我拦截一个数据包并提取有效负载。此有效负载是压缩的 jpeg 字节流数据(例如,此数据分配给unsigned char *payload)。我知道如果我有一个 FILE 指针,那么我可以使用 libjpeg 库来提取图像信息。我的问题是有没有办法将我的指针(*payload)传递给 libjpeg 函数以获取 RGB 值和图像的尺寸?

谢谢你。

4

4 回答 4

4

回复:亚当罗森菲尔德的回答,你不必自己实现任何东西:jpeg_mem_src()会做你想做的事:

jpeg_mem_src(&cinfo, payload, payload_len);

您必须将整个图像存储在内存中(并知道它的长度)。

obStackoverflow:我知道,一个非常老的问题的答案,但今天我必须这样做,这个页面在我的网络搜索中排名第一或第二。

于 2011-09-01T17:00:02.487 回答
3

要添加到Tal 的答案,您应该做的是查看jpeg_stdio_src()函数的实现jdatasrc.c。该函数的目的是初始化数据源对象,即cinfo->src. 所以,你应该做的是以下几点:

  1. 创建一个结构(类似于 中的my_source_mgr结构jdatasrc.c),它的第一个成员是struct jpeg_source_mgr. 添加您认为必要的任何其他成员。请注意,我们实际上是在进行手动继承——在 C++ 中,我们将定义一个派生自 的类jpeg_source_mgr,而在其中声明的各种函数指针jpeg_source_mgr将改为虚函数。但是,我们使用的是 C,所以我们必须以艰难的方式进行继承和多态。

  2. 为结构实例分配空间,确保分配正确的字节数,并填写数据成员。

  3. 实现以下五个功能:

    • 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)

    请注意,对于内存缓冲区,这些函数可能非常微不足道。

  4. 最后,初始化jpeg_source_mgr成员中的函数指针以指向这些函数。

有了这个,您就可以使用它而不是jpeg_stdio_src()初始化数据源管理器,然后您就可以像从文件系统中解码文件一样进行操作了。

于 2009-05-07T05:10:15.683 回答
0

在最近的 libjpeg 版本中,jpeg_mem_src已经为您实现了。

为 windows 编译 libjpeg 非常容易。

从项目网页下载源代码 将
所有内容提取到一个文件夹中
然后打开 Visual Studio 10 命令提示符到该目录

类型

nmake /f makefile.vc setup-v10

这将创建一个 .sln 文件,该文件将在 VS2010 中打开。它应该从那里编译。

之后您也可以调试 libjpeg 源代码。

于 2012-09-11T04:06:06.887 回答
0

libjpeg 具有输入/输出管理器,可以扩展为使用原始内存缓冲区或您拥有的任何其他形式的 I/O,但 AFAIK 只有 FILE* 实际上在库的版本中实现。

于 2009-05-07T04:43:01.100 回答