Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C函数返回图像的正确方法是什么?_C - Fatal编程技术网

从C函数返回图像的正确方法是什么?

从C函数返回图像的正确方法是什么?,c,C,我是C语言的新手,试图理解基础知识 我想调用一个创建并返回jpeg图像的函数 在Python等其他语言中,只需将函数的返回值放入变量中即可。C显然不是这样工作的 那么,一个函数向另一个函数请求jpeg图像并接收回该图像(大小未知)的正确方法是什么 创建一个定义缓冲区指针和长度的结构,然后在两个函数的作用域之外设置一个变量,以便两个函数都可以访问数据,这是正确的方法吗 大概我还需要通过tjFree(&_compressedImage)正确地释放makeimg函数中使用的内存 我从网上的某个地方复制

我是C语言的新手,试图理解基础知识

我想调用一个创建并返回jpeg图像的函数

在Python等其他语言中,只需将函数的返回值放入变量中即可。C显然不是这样工作的

那么,一个函数向另一个函数请求jpeg图像并接收回该图像(大小未知)的正确方法是什么

创建一个定义缓冲区指针和长度的结构,然后在两个函数的作用域之外设置一个变量,以便两个函数都可以访问数据,这是正确的方法吗

大概我还需要通过
tjFree(&_compressedImage)正确地释放makeimg函数中使用的内存

我从网上的某个地方复制了这个函数的代码。它创建了一个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);
}
static void makeimg(){
常量int JPEG_质量=75;
const int COLOR_COMPONENTS=3;
int_宽度=1920;
int_高度=1080;
长无符号整数_jpegSize=0;
无符号字符*_compressedImage=NULL;/!<如果_jpegSize==0,则tjCompress2会分配内存
无符号字符缓冲区[_width*_height*COLOR\u COMPONENTS];/!<包含未压缩的图像
tjhandle_jpegCompressor=tjInitCompress();
tjCompress2(_JPEG压缩程序、缓冲区、宽度、0、高度、TJPF_RGB、,
&_压缩图像和JPEG大小、TJSAMP_444、JPEG质量、,
TJFLAG_FASTDCT);
tjDestroy(压缩机);
//要释放TurboJPEG(tjAlloc())分配的内存,
//或通过压缩/解压缩)在完成操作后:
tjFree(&_压缩图像);
}
任何关于采取好方法的指导都是值得赞赏的


我是C语言的初学者(对Python很有经验),如果您能尽可能多地解释一下您的回答,我将不胜感激。

有多种方法可以做到这一点。我比较喜欢以下几点:

/*
 * 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;
}
/*
*生成图像并返回长度
*错误时返回<0
*
*电话如下:
*字符*图像;
*int len=生成图像(&image);
*如果(len<0){/*进程错误代码*/}
*/
int makeImage(void**image){
无符号字符*图像;
整数长度;
/*创建图像并在长度变量中设置缓冲区的长度*/
/*返回图像*/
*图像=_图像;
返回长度;
}

如果不需要多个错误代码,将image参数设置为null并检查它可能就足够了。

初学者C问题:为什么参数类型**我理解为指向指针的指针?@DukeDougal双指针用于通过此参数返回指针。这发生在
*image=\u image:双指针被取消引用,其后面的简单指针被写入。如果返回值是一个
int
,则参数的类型应该是
int*
,但由于返回值本身就是一个指针
void*
,因此参数的类型必须是双指针
void**
。顺便说一句,像这样使用
void*
不是一个好主意。这使得类型检查变得不可能。如果您想保持数据结构的内容私有,只需做一个前向声明
typedef struct Image
并将其用于指针类型
int makeImage(Image**out\u Image)@cmaster同意。虽然在这种情况下,返回的实际上只是一个缓冲区。可能没问题。@DukeDougal,因为C支持按值调用。在被调用方法中设置值不会更改调用方方法中的值