【问题标题】:converting bytestream to RGB using libjpeg使用 libjpeg 将字节流转换为 RGB
【发布时间】:2009-05-07 04:16:46
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: rgb libjpeg


    【解决方案1】:

    回复: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 结构的函数指针成员。
    【解决方案2】:

    要添加到Tal's answer,你应该看一下jdatasrc.cjpeg_stdio_src() 函数的实现。该函数的目的是初始化数据源对象,即cinfo->src。所以,你应该做的是:

    1. 创建一个结构(类似于jdatasrc.c 中的my_source_mgr 结构),它的第一个成员是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() 来初始化数据源管理器,然后您就可以像从文件系统中解码文件一样进行操作了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在最近的 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 源代码。

        【讨论】:

        • 当我打开 VS 命令提示符时,它给出了一个错误,它无法找到 VS Common Toosl 文件夹,因此它无法识别 nmake 命令,有什么解决方法吗?
        • 只要找到nmake,直接调用即可。像 >C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\nmake /f makefile.vc setup-v10
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 2019-08-12
        • 2015-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多