2011-03-12 52 views
5

मैं Libjpeg संस्करण 6b का उपयोग कर रहा हूँ। संस्करण 8 में उनके पास jpeg_mem_src(...) नामक स्मृति के डेटा को पढ़ने के लिए एक अच्छा फ़ंक्शन है, दुर्भाग्यवश ver। 6 बी में यह फ़ंक्शन नहीं है।libjpeg ver। 6b jpeg_stdio_src बनाम 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

या आप जीएनयू के 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 शामिल करें और आप सब तैयार हैं।