图像格式转换-libswscale

libswscale 是一个主要用于处理图片像素数据的类库。可以完成图片像素格式的转换,图片的拉伸,图像的滤波等工作。
头文件<libswscale/swscale.h>

主要使用下面三个函数实现对图片的操作:

sws_getContext()/sws_getCachedContext():初始化一个SwsContext
sws_scale():处理图像数据
sws_freeContext():释放一个SwsContext

1、sws_getContext

struct SwsContext *sws_getContext( int srcW, /* 源图像的宽度 */
                                int srcH, /* 源图像的宽度 */
                                enum AVPixelFormat srcFormat, /* 源图像的像素格式 */
                                int dstW, /* 目标图像的宽度 */
                                int dstH, /* 目标图像的高度 */
                                enum AVPixelFormat dstFormat, /* 目标图像的像素格式 */
                                int flags,/* 选择缩放算法(只有当源图像和目标图像大小不同时有效),一般选择SWS_FAST_BILINEAR */
                                SwsFilter *srcFilter, /* 源图像的滤波器信息, 若不需要传NULL */
                                SwsFilter *dstFilter, /* 目标图像的滤波器信息, 若不需要传NULL */
                                const double *param /* 特定缩放算法需要的参数,默认为NULL */ );

sws_getContext() 和sws_getCachedContext() 类似,不同的在于sws_getContext可以用于多路码流转换,为每个不同的码流都指定一个不同的转换上下文,而 sws_getCachedContext 只能用于一路码流转换。

关于图像缩放算法flag的值在定义在libswscale\swscale.h中

#define SWS_FAST_BILINEAR     1
#define SWS_BILINEAR                2
#define SWS_BICUBIC                  4
#define SWS_X                              8
#define SWS_POINT                     0x10
#define SWS_AREA                      0x20
#define SWS_BICUBLIN               0x40
#define SWS_GAUSS                   0x80
#define SWS_SINC                       0x100
#define SWS_LANCZOS               0x200
#define SWS_SPLINE                    0x400
#define SWS_SRC_V_CHR_DROP_MASK     0x30000
#define SWS_SRC_V_CHR_DROP_SHIFT    16
#define SWS_PARAM_DEFAULT                     123456
#define SWS_PRINT_INFO                               0x1000

关于各算法的性能可以查看雷神大大的博客 sws_scale缩放算法性能测试 

2、sws_freeContext

void sws_freeContext(struct SwsContext *swsContext);

释放sws_getContext返回的SwsContext对象指针

3、sws_scale

int sws_scale(struct SwsContext *c, /*上下文结构体,sws_getContext返回的对象指针*/
             const uint8_t *const srcSlice[], /*源图像颜色通道数据指针,AVFrame中的data[]*/
             const int srcStride[],/*源图像每个颜色通道的跨度,行字节数,AVFrame中的linesize[],可以确定下一行的起始位置*/
             int srcSliceY, /*srcSliceY和srcSliceH构成数据处理区,srcSliceY表示起始位置,srcSliceH表示处理的行数*/
             int srcSliceH,/*可以使用多个线程加快处理过程,如创建两个线程,一个处理[0,2/h]行,另一个处理[h/2+1,h]行*/
             uint8_t *const dst[],/*目标图像通道数据指针*/
             const int dstStride[]/*目标图像每个颜色通道的跨度,行字节数*/);
    /*返回值为转换后图像的高度*/

sws_scale() 函数主要是用来实现视频像素格式和分辨率的转换,优点在于在同一个函数中实现图像色彩空间转换、分辨率缩放、前后图像滤波处理;缺点就是效率相对较低

 

在调用sws_scale之前一般会使用av_image_fill_arrays()填充目标图像的缓存区,不然会导致sws_scale()转换失败

int av_image_fill_arrays(uint8_t *dst_data[4], /*图像data指针*/
                     int dst_linesize[4],  /*data的宽度*/
                     const uint8_t *src,  /*图像数据缓存区,大小为图像大小*/
                     enum AVPixelFormat pix_fmt, /* 像素格式*/
                     int width,  /* 图像的宽度*/
                     int height,  /* 图像的高度*/
                     int align  /* 缓存区的对齐方式*/);

图像的大小一般使用av_image_get_buffer_size()函数获取

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值