5

Libjpegバージョン6bを使用しています。jpeg_mem_src(...)バージョン8では、残念ながらver。と呼ばれるメモリからデータを読み取るための優れた機能があります。6bにはこの機能はありません。

圧縮データをメモリから直接読み取るために何を使用できますか?私が見るのはjpeg_stdio_src、ハードドライブから読み取るものだけです。

4

3 に答える 3

14

自分で書いて...

/* 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 はそのバッファの長さです。

于 2011-03-14T13:28:47.910 に答える