gpt4 book ai didi

c - libjpeg Turbo tjCompressFromYUV

转载 作者:行者123 更新时间:2023-11-30 15:10:25 25 4
gpt4 key购买 nike

我想使用 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() 返回的错误字符串是“Bogus input colorspace”。

我尝试链接 libturbojpeg 版本 1.4.2 和 1.4.90。

任何帮助将不胜感激,

谢谢

最佳答案

Turbojpeg API tjCompressFromYUV 允许您对 jpegBuf 进行以下选项:

@param jpegBuf 指向将接收图像缓冲区的指针的地址JPEG 图像。 TurboJPEG 能够重新分配 JPEG 缓冲区适应 JPEG 图像的大小。因此,您可以选择:

  1. 使用 #tjAlloc() 预分配任意大小的 JPEG 缓冲区并让 TurboJPEG 根据需要增加缓冲区,

  2. 将 *jpegBuf 设置为 NULL 以告诉 TurboJPEG 分配缓冲区为您服务,或者

  3. 将缓冲区预先分配为通过调用确定的“最坏情况”大小tjBufSize()。这应该确保缓冲区永远不必重新分配(设置#TJFLAG_NOREALLOC 可以保证这一点。)

    如果您选择选项 1,*jpegSize 应设置为您的文件大小预先分配的缓冲区。无论如何,除非您设置了#TJFLAG_NOREALLOC,您应该始终在从此函数返回时检查 *jpegBuf,如它可能已经改变了。

因此,通过使用第二个选项,无需调用 tjBufSizeYUV2 和 tjAlloc,只需在调用 tjcompressFromYUV 之前设置 jpegBuf=NULL 并在压缩后执行 tjFree 即可。

关于c - libjpeg Turbo tjCompressFromYUV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36176222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com