【问题标题】:using jpeglib for JPEG compressed byte stream将 jpeglib 用于 JPEG 压缩字节流
【发布时间】:2009-03-12 01:15:46
【问题描述】:

我将 JPEG 压缩字节流存储在一个名为“Image”的变量中,我想将此字节流转换为 RGB。

例如:unsigned char *Image;

我的问题是:有没有办法将“图像”传递给 jpeg_stdio_src() 以获取 RGB 颜色值?

谁能告诉我如何使用 jpeglib 库从字节流“图像”中获取 RGB?

谢谢

【问题讨论】:

    标签: bytearray rgb libjpeg


    【解决方案1】:

    试试这样的。这使用对象 currImage 来存储结果(此处未声明)。

    typedef struct {
      struct jpeg_source_mgr pub;   // public fields
    
      JOCTET * buffer;              // start of buffer
      boolean start_of_file;        // have we gotten any data yet?
    } my_source_mgr;
    
    typedef my_source_mgr * my_src_ptr;
    
    static void jpg_memInitSource(j_decompress_ptr cinfo)
    {
      my_src_ptr src = (my_src_ptr) cinfo->src;
      src->start_of_file = true;
    }
    
    static boolean jpg_memFillInputBuffer(j_decompress_ptr cinfo)
    {
      my_src_ptr src = (my_src_ptr) cinfo->src;
      src->start_of_file = FALSE;
      return TRUE;
    }
    
    static void jpg_memSkipInputData(j_decompress_ptr cinfo, long num_bytes)
    {
      my_src_ptr src = (my_src_ptr) cinfo->src;
      if (num_bytes > 0) {
        src->pub.next_input_byte += (size_t) num_bytes;
        src->pub.bytes_in_buffer -= (size_t) num_bytes;
      }
    }
    
    static void jpg_memTermSource(j_decompress_ptr cinfo)
    {
      // no work necessary here
    }
    
    void decompressJpeg(uint8 const *compressed, size_t len)
    {
      struct jpeg_decompress_struct cinfo;
      struct jpeg_error_mgr         jerr;
      my_src_ptr src;
    
      // ToDo: change error handling to work with our return codes
      cinfo.err = jpeg_std_error(&jerr);
      jpeg_create_decompress(&cinfo);
    
      cinfo.src = (struct jpeg_source_mgr *)
        (*cinfo.mem->alloc_small) ((j_common_ptr) &cinfo, JPOOL_PERMANENT,
        sizeof(my_source_mgr));
      src = (my_src_ptr) cinfo.src;
      src->buffer = (JOCTET *)compressed;
    
      src->pub.init_source = jpg_memInitSource;
      src->pub.fill_input_buffer = jpg_memFillInputBuffer;
      src->pub.skip_input_data = jpg_memSkipInputData;
      src->pub.resync_to_restart = jpeg_resync_to_restart;
      src->pub.term_source = jpg_memTermSource;
      src->pub.bytes_in_buffer = len;
      src->pub.next_input_byte = compressed;
    
      jpeg_read_header(&cinfo, true);
      jpeg_start_decompress(&cinfo);
    
      // check: cinfo.out_color_space == JCS_RGB
    
      currImage.setSize(
        (int)cinfo.output_width, (int)cinfo.output_height));
    
      size_t w = currImage.getWidth() * 3;
      uint8 *p = (uint8*)currImage.getPixels();
      while (cinfo.output_scanline < cinfo.output_height) {
        jpeg_read_scanlines(&cinfo, &p, 1);
        p += w;
      }
    
      jpeg_finish_decompress(&cinfo); // Do this even under error conditions
      jpeg_destroy_decompress(&cinfo); // Do this even under error conditions
    }
    

    编辑:添加了一些缺少的支持代码。谢谢,Edu Filipe!

    【讨论】:

    • 这不起作用。请提供该代码的工作版本。
    • @Edu:你能说得更具体一点吗?您需要#include jpeglib 并将任何 currImage 代码替换为您喜欢的任何图像表示。在这里,我使用了一个对象,该对象将图像存储为压缩的 RGB 像素,无需调整步幅以实现更好的内存对齐。您应该使用对您的应用程序有意义的任何表示形式:C 或 C++ 中没有单一的标准。
    • @mr-fooz 实际上,您的代码中没有实现回调函数的棘手部分。 jpg_memFillInputBuffer、jpg_memSkipInputData 和 jpg_memTermSource 之类的东西。
    • @Edu:谢谢...出于某种原因,我认为这些是内置的。我已经添加了我使用的实现。
    • @mr-fooz SO 不允许我支持你的问题,但绝对值得!
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2017-02-12
    • 2014-02-02
    相关资源
    最近更新 更多