【问题标题】:libjpeg ver. 6b jpeg_stdio_src vs jpeg_mem_srclibjpeg 版本6b jpeg_stdio_src 与 jpeg_mem_src
【发布时间】:2011-03-12 05:24:07
【问题描述】:

我正在使用 Libjpeg 版本 6b。在版本 8 中,它们有一个很好的功能,可以从名为 jpeg_mem_src(...) 的内存中读取数据,不幸的是版本。 6b没有这个功能。

我可以使用什么来直接从内存中读取压缩数据?我看到的只是从硬盘读取的jpeg_stdio_src

【问题讨论】:

    标签: c++ libjpeg


    【解决方案1】:

    自己写...

    /* Read JPEG image from a memory segment */
    static void init_source (j_decompress_ptr cinfo) {}
    static boolean fill_input_buffer (j_decompress_ptr cinfo)
    {
        ERREXIT(cinfo, JERR_INPUT_EMPTY);
    return TRUE;
    }
    static void skip_input_data (j_decompress_ptr cinfo, long num_bytes)
    {
        struct jpeg_source_mgr* src = (struct jpeg_source_mgr*) cinfo->src;
    
        if (num_bytes > 0) {
            src->next_input_byte += (size_t) num_bytes;
            src->bytes_in_buffer -= (size_t) num_bytes;
        }
    }
    static void term_source (j_decompress_ptr cinfo) {}
    static void jpeg_mem_src (j_decompress_ptr cinfo, void* buffer, long nbytes)
    {
        struct jpeg_source_mgr* src;
    
        if (cinfo->src == NULL) {   /* first time for this JPEG object? */
            cinfo->src = (struct jpeg_source_mgr *)
                (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
                SIZEOF(struct jpeg_source_mgr));
        }
    
        src = (struct jpeg_source_mgr*) cinfo->src;
        src->init_source = init_source;
        src->fill_input_buffer = fill_input_buffer;
        src->skip_input_data = skip_input_data;
        src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
        src->term_source = term_source;
        src->bytes_in_buffer = nbytes;
        src->next_input_byte = (JOCTET*)buffer;
    }
    

    然后使用它:

    ...
        /* Step 2: specify data source (eg, a file) */
        jpeg_mem_src(&dinfo, buffer, nbytes);
    ...
    

    其中 buffer 是指向包含压缩 jpeg 图像的内存块的指针,nbytes 是该缓冲区的长度。

    【讨论】:

    • 什么是ERREXIT?复制粘贴此代码,它没有为我定义。
    • src->bytes_in_buffer -= (size_t) num_bytes; - 这会导致整数下溢,导致 OOB 访问。
    【解决方案2】:

    为苦等一年多的s093294答疑解惑。我无法发表评论,因此创建新答案是唯一的方法。

    ERREXIT 是 libjpeg 中的一个宏。包括 jerror.h,一切就绪。

    【讨论】:

      【解决方案3】:

      或者您也可以尝试使用 GNU 的 fmemopen() 函数,该函数应在 stdio.h 头文件中声明。

      FILE * source = fmemopen(inbuffer, inlength, "rb");
      if (source == NULL)
      {
          fprintf(stderr, "Calling fmemopen() has failed.\n");
          exit(1);
      }
      
      // ...
      
      jpeg_stdio_src(&cinfo, source);
      
      // ...
      
      fclose(source);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多