Как правильно вернуть изображение из функции C? - PullRequest
0 голосов
/ 24 сентября 2019

Я новичок в C, пытаюсь понять основы.

Я хочу вызвать функцию, которая создает и возвращает изображение в формате JPEG.

На другом языке, таком как Python, вы могли быпросто поместите возвращаемое значение из функции в переменную.Очевидно, что C не работает таким образом.

Каков правильный способ для одной функции запрашивать другую у jpeg-изображения и получать обратно это изображение неизвестного размера?

Является ли правильный способ создания структуры, которая определяет указатель на буфер и длину, а затем установить переменную вне области действия обеих функций, чтобы обе функции могли получить доступ к данным?

Предположительно, мне также нужно правильно освободить память, используемую внутри функции makeimg, с помощью tjFree(&_compressedImage);

Я скопировал код этой функции из сети.Это создает функцию JPEG.Я хочу вернуть полученный jpeg обратно.

static void makeimg() {
        const int JPEG_QUALITY = 75;
        const int COLOR_COMPONENTS = 3;
        int _width = 1920;
        int _height = 1080;
        long unsigned int _jpegSize = 0;
        unsigned char* _compressedImage = NULL; //!< Memory is allocated by tjCompress2 if _jpegSize == 0
        unsigned char buffer[_width*_height*COLOR_COMPONENTS]; //!< Contains the uncompressed image
        tjhandle _jpegCompressor = tjInitCompress();
        tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
                  &_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
                  TJFLAG_FASTDCT);
        tjDestroy(_jpegCompressor);
        //to free the memory allocated by TurboJPEG (either by tjAlloc(),
        //or by the Compress/Decompress) after you are done working on it:
        tjFree(&_compressedImage);
}

Любое руководство по хорошему подходу, чтобы получить оценку.

Я новичок в C (опыт работы с Python), так что если вы могли быпожалуйста, объясните как можно больше о вашем ответе, он будет очень признателен.

1 Ответ

1 голос
/ 24 сентября 2019

Есть несколько способов сделать это.Я предпочитаю следующее:

/*
 * Makes an image and returns the length
 * returns < 0 on error
 *
 * Call as follows:
 *  char *image ;
 *  int len = make_image( &image );
 *  if (len < 0) { /* Process error code */ }
*/
int makeImage(void **image) {
    unsigned char *_image ;
    int length ;
    /* Create image and set the length of buffer in length variable */
    /* Return the image */
    *image = _image ;
    return length;
}

Если вам не нужны множественные коды ошибок, достаточно установить для параметра изображения значение null и проверить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...