Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>нужен 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>>