当前位置: 首页 > >

图像格式转换-libswscale

发布时间:

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


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


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的值在定义在libswscaleswscale.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()函数获取

?



友情链接: