使用libjpeg将字节流转换为RGB

时间:2009-05-07 04:16:46

标签: rgb libjpeg

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

谢谢。

4 个答案:

答案 0 :(得分:3)

要添加到Tal's answer,您应该做的是查看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成员中的函数指针以指向这些函数。
  5. 有了这个,你可以使用它而不是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源代码。