我想使用C中的libturbojpeg将平面4:2:0的YUV缓冲区压缩到jpeg映像中,但是我在使用tjCompressFromYUV()函数时遇到了问题。
这是我的密码:
#define PADDING 2
tjhandle tjh;
unsigned long buf_size;
unsigned char *jpegBuf = NULL;
unsigned long jpegSize;
int width = 352;
int height = 288;
int quality = 70;
unsigned char *ucp_frame;
int j;
FILE *fp = NULL;
ucp_frame = malloc(width * height * 3 / 2);
if ( NULL == ucp_frame ) {
printf("malloc error ucp_frame\n");
return 0;
}
fp = fopen("planar_352x288.raw", "rb");
if( NULL == fp ) {
printf("fopen error\n");
return 0;
}
j = fread( ucp_frame, 1, width * height * 3 / 2, fp);
if( j != width * height * 3 / 2 ) {
printf("fread error\n");
return 0;
}
fclose(fp);
tjh = tjInitCompress();
if( NULL == tjh ) {
printf("tjInitCompress error '%s'\n", tjGetErrorStr() );
return 0;
}
buf_size = tjBufSizeYUV2( width, PADDING, height, TJSAMP_420);
jpegBuf = tjAlloc(buf_size);
if( tjCompressFromYUV( tjh, ucp_frame, width, PADDING, height,
TJSAMP_420, &jpegBuf, &jpegSize, quality,
TJFLAG_NOREALLOC ) ) {
printf("tjCompressFromYUV error '%s'\n", tjGetErrorStr() );
}tjGetErrorStr()返回的错误字符串是“伪输入颜色空间”。
我试着链接lib涡轮tried版本1.4.2和1.4.90。
任何帮助都值得感谢,
谢谢
发布于 2018-07-23 17:09:37
Turbojpeg API tjCompressFromYUV允许您为jpegBuf提供这样的选项:
@param jpegBuf地址指向将接收该图像的图像缓冲区的指针。TurboJPEG能够重新分配JPEG缓冲区以适应JPEG图像的大小。因此,您可以选择:
因此,通过使用第二个选项,不需要调用tjBufSizeYUV2和tjAlloc,只需在调用tjCompressFromYUV之前拥有jpegBuf=NULL,在压缩后执行tjFree。
发布于 2016-03-24 08:28:28
结果发现,问题出在包含我发布的代码的程序中,在一个较小的测试程序中,tjBufSizeYUV2调用按预期执行。
另外,如果jpegBuf是在调用tjBufSizeYUV2之前预先分配的,那么传递给tjBufSizeYUV2的flag参数必须包含TJFLAG_NOREALLOC,否则即使tjFree(jpegBuf);稍后被调用,jpegBuf也不会被释放。
发布于 2020-09-19 09:41:13
#define PADDING 4
jpegBuf = tjAlloc(width*height*3/2);
https://stackoverflow.com/questions/36176222
复制相似问题