2024年C C++最新libjpeg学习4:libjpeg-turbo之YUV_tjdecompresstoyuv2,深入理解C C++的核心知识点

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

need_size = tjBufSizeYUV2(width, padding, height, subsample);
if (need_size != yuv_size)
{
    printf("we detect yuv size: %d, but you give: %d, check again.\n", need_size, yuv_size);
    return 0;
}

ret = tjCompressFromYUV(handle, yuv_buffer, width, padding, height, subsample, jpeg_buffer, jpeg_size, quality, flags);
if (ret < 0)
{
    printf("compress to jpeg failed: %s\n", tjGetErrorStr());
}

tjDestroy(handle);

return ret;

}


  
 


另外,该库也支持从RGB转换成YUV,或反之。调用相应的函数即可,不再详述。示例代码如下:



int trgb2yuv(unsigned char* rgb_buffer, int width, int height, unsigned char** yuv_buffer, int* yuv_size, int subsample)
{
tjhandle handle = NULL;
int flags = 0;
int padding = 1; // 1或4均可,但不能是0
int pixelfmt = TJPF_RGB;
int ret = 0;

handle = tjInitCompress();

flags |= 0;

*yuv_size = tjBufSizeYUV2(width, padding, height, subsample);

*yuv_buffer =(unsigned char *)malloc(*yuv_size);
if (*yuv_buffer == NULL)
{
    printf("malloc buffer for rgb failed.\n");
    return -1;
}
ret = tjEncodeYUV3(handle, rgb_buffer, width, 0, height, pixelfmt, *yuv_buffer, padding, subsample, flags);
if (ret < 0)
{
    printf("encode to yuv failed: %s\n", tjGetErrorStr());
}

tjDestroy(handle);

return ret;

}

int tyuv2rgb(unsigned char* yuv_buffer, int yuv_size, int width, int height, int subsample, unsigned char** rgb_buffer, int* rgb_size)
{
tjhandle handle = NULL;
int flags = 0;
int padding = 1; // 1或4均可,但不能是0
int pixelfmt = TJPF_RGB;
int need_size = 0;
int ret = 0;

handle = tjInitDecompress();

flags |= 0;

need_size = tjBufSizeYUV2(width, padding, height, subsample);
if (need_size != yuv_size)
{
    printf("we detect yuv size: %d, but you give: %d, check again.\n", need_size, yuv_size);
    return -1;
}

*rgb_size = width*height*tjPixelSize[pixelfmt];

*rgb_buffer =(unsigned char *)malloc(*rgb_size);
if (*rgb_buffer == NULL)
{
    printf("malloc buffer for rgb failed.\n");
    return -1;
}
ret = tjDecodeYUV(handle, yuv_buffer, padding, subsample, *rgb_buffer, width, 0, height, pixelfmt, flags);
if (ret < 0)
{
    printf("decode to rgb failed: %s\n", tjGetErrorStr());
}

tjDestroy(handle);

return ret;

}


  
 


以上代码示例,二级指针均在函数内分配内存,需要调用者自行释放,否则会有内存泄漏。


  
 


李迟 7.8


  
 



![img](https://img-blog.csdnimg.cn/img_convert/a8ba39ecc2e1d89d22d30da7f89da1fe.png)
![img](https://img-blog.csdnimg.cn/img_convert/7b01003b6175bc3da2a2c277b08c3cdf.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

s.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值