Re: FILE* в памяти
От: DarkOn Латвия  
Дата: 08.04.05 12:27
Оценка: +2
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>нужен JEPG в памяти; а libjpeg, зараза, либо через FILE*, либо какой-то кошмарный геморрой.


Ну незнаю где там кошмарный геморой, там все просто. Например так:

typedef struct jmemdst_s
{
    struct jpeg_destination_mgr dst;
    byte *data;
    size_t asize;        // allocated size
    size_t isize;        // image size
} jmemdst_t;

static void init_destination(j_compress_ptr cinfo)
{
    jmemdst_t *dst=(jmemdst_t *)cinfo->dest;

    dst->isize=0;
    dst->dst.free_in_buffer=dst->asize-dst->isize;
    dst->dst.next_output_byte=dst->data+dst->isize;
}

static boolean empty_output_buffer(j_compress_ptr cinfo)
{
    jmemdst_t *dst=(jmemdst_t *)cinfo->dest;

// write current buffer
    dst->isize=dst->asize;
    dst->asize+=64*1024;    // 64Kb increments
    dst->data=realloc(dst->data, dst->asize);

    dst->dst.free_in_buffer=dst->asize-dst->isize;
    dst->dst.next_output_byte=dst->data+dst->isize;
    return TRUE;
}

static void term_destination(j_compress_ptr cinfo)
{
    jmemdst_t *dst=(jmemdst_t *)cinfo->dest;

// compression complete
    dst->isize=dst->asize-dst->dst.free_in_buffer;
}

static void jpeg_mem_dst(j_compress_ptr cinfo)
{
    jmemdst_t *dst;

// allocate destination manager object
    dst=(jmemdst_t *)(*cinfo->mem->alloc_small)((j_common_ptr)cinfo, JPOOL_PERMANENT, sizeof(jmemdst_t));
// allocate memory
    dst->isize=0;
    dst->asize=64*1024;    // 64Kb initial image size
    dst->data=malloc(dst->asize);

// initialize
    dst->dst.free_in_buffer=dst->asize-dst->isize;
    dst->dst.next_output_byte=dst->data+dst->isize;
    dst->dst.init_destination=init_destination;
    dst->dst.empty_output_buffer=empty_output_buffer;
    dst->dst.term_destination=term_destination;

// assign
    cinfo->dest=(struct jpeg_destination_mgr*)dst;
}


использование:

unsigned char *data;
size_t isize;

<...>

    jpeg_create_compress(&cinfo);
//    jpeg_stdio_dest(&cinfo, fp);
    jpeg_mem_dst(&cinfo);

<....>

// get data & size, don't forget to free data
    data=((jmemdst_t *)cinfo.dest)->data;
    isize=((jmemdst_t *)cinfo.dest)->isize;

// release compression object
    jpeg_destroy_compress(&cinfo);

// тут имеем данные в data[] и размер в isize

<....>

// не забываем освободить память
    free(data);


удачи!
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
--
keep on coding..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.