2011-03-12 50 views
5

我正在使用libjpeg版本6b。在版本8中,他們有一個很好的功能來從內存中讀取數據,稱爲jpeg_mem_src(...),不幸的是。 6b沒有這個功能。libjpeg ver。 6b jpeg_stdio_src vs jpeg_mem_src

我能用什麼來直接從內存中讀取壓縮數據?我看到的是從硬盤讀取的jpeg_stdio_src

回答

9

自己寫的......

/* 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); 
... 

其中緩衝區是一個指向包含壓縮的JPEG圖像的內存塊,併爲nbytes是長度的緩衝區。

+1

什麼是ERREXIT?複製粘貼這個代碼和它沒有爲我定義。 –

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); 
6

回答貧困s093294誰一直在等待一年多的答案。我無法評論,因此創建新答案是唯一的方法。

ERREXIT是libjpeg中的一個宏。包含jerror.h,你就全部設置好了。