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