2016-08-27 3 views
0

Я столкнулся с этой проблемой при поиске, как писать в буфер вместо файла, и у меня возникли проблемы с поиском хорошего примера.Как правильно использовать jpeg_mem_dest с и без std :: vector

Это то, что говорит jpeglib.h, но я не уверен, как это использовать.

/* Data source and destination managers: memory buffers. */ 
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, 
        unsigned char ** outbuffer, 
        unsigned long * outsize)); 

В example.c мы устанавливаем назначения данных на Шаг 2 так, как бы один использовать это здесь, если у нас уже есть std::vector<unsigned char> buffer, который содержит значения RGB.

/* Step 2: specify data destination (eg, a file) */ 
/* Note: steps 2 and 3 can be done in either order. */ 
    jpeg_mem_dest(&cinfo, /*WHAT GOES HERE*/, /*WHAT GOES HERE*/); 

После этого не будет сделано, какие изменения мы делаем на Шаг 5 так, что мы пишем в же буфер, где наши расжатая значения RGB были?

/* Step 5: while (scan lines remain to be written) */ 
/*   jpeg_write_scanlines(...); */ 

Я что-то пропустил? Я очень ценю любую помощь, благодарю вас заранее.

ответ

0

Вы должны посмотреть документацию. Но outbuffer - это неподписанный символ **. Поэтому почти наверняка функция вызовет malloc, а затем выведет outbuffer на результат.

/* 
    skeleton code - it won't be this exactly but will 
    look like this. 
*/ 
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, 
        unsigned char ** outbuffer, 
        unsigned long * outsize)) 
{ 
    int width, height; 
    unsigned char *rgba; 

    getimagesize(cinfo, &width, & height); 
    rgba = malloc(width * height * 4); 

    decompress(cinfo, rgba); 

    *outbuffer = rgba; 
    *outsize = width * height *4; 
} 

Так позвонить

unsigned char *rgba; 
unsigned long size; 
std::vector<unsigned char> buffer. 
jpeg_mem_dest(jpegdata, &rgba, &size); 
if(size > 0) 
{ 
    buffer.resize(size); 
    for(i=0;i<size;i++) 
    buffer[i] = rgba[i]; 
    free(rgba); 
} 
+0

Я не могу заставить его работать. Либо получите нарушение доступа к записи, либо странные сбои без описания. Не могли бы вы привести рабочий пример? Было бы очень признательно. Также есть способ, которым я мог бы обходить массив rgba и напрямую писать в мой 'std :: vector'? –

+0

У меня нет библиотеки. Я не могу скомпилировать рабочий пример. это сбой в вызове или доступ к буферам? Возможно, вам просто нужно инициализировать rgba до нуля. Просмотрите спецификацию интерфейса функции. –