FFmpeg/OpenCV 实现全屏斜体水印

在这里插入图片描述

实现思路 🤔​

  1. 基于ffmpeg,画布的方式,创建画布 -> 水印 -> 旋转 -> 抠图 -> 叠加到图像上
  2. 基于ffmpeg,旋转图片的方式,填充 -> 水印 -> 顺时针旋转 -> 逆时针旋转 -> 截图
  3. 基于opencv,创建画布 -> 水印 -> 仿射变换 -> 水平垂直拼接 -> 叠加图片上

经测试比对,opencv实现方式效率是最快的


代码实现 💨

  1. FFmpeg
    1. 旋转画布方式

    2. 旋转图片方式

      1. 思路:
        • 首先将图片填充放大,然后计算出水印位置,叠加水印,再逆时针将图片旋转回来,字体就变斜了。然后通过剪裁,将图片剪切成原图大小。
      2. 基于 ffmpeg filter 实现
      	// 填充
      	// [in]scale=原图宽:原图高,pad=填充后宽:填充后高:填充左右大小:填充上下大小:black[out]
      	// 四周填充,  pad 输入尺寸的一半
      	char dtext[512];
      	snprintf(dtext, sizeof(dtext), "[in]scale=%d:%d,pad=%d:%d:%d:%d:black[out]",
      	frameWidth, frameHeight, expandFrameWidth, expandFrameHeight, expandSize, expandSize);
      	
      	// 水印
      	// inxxxx[a];[a]xxx[a];[a]xxx[out]  中间传的文字标签首位对应([a] [a]). 结束没有';'. 
      	char dtext[1000];
      	snprintf(dtext, sizeof(dtext), "[in]drawtext=fontfile=%s:text=%s:x=%d:y=%d:fontsize=%d:fontcolor=%s:alpha=%.1f[a];",kFont, txt.c_str(), start_x, start_y, kFontSize, kFontColor, italicTextInfo_.alpha);
      	
      	// 翻转
      	// [in]rotate=PI* angel /180[out] 
      	char dtext[512];
      	snprintf(dtext, sizeof(dtext), "[in]rotate=PI* %d /180[out]", angel);
      	
      	// 截取 
      	// [in]crop=原图宽:原图高:截取x:截取y[out]
      	char dtext[512];
      	snprintf(dtext, sizeof(dtext), "[in]crop=%d:%d:%d:%d[out]", frameWidth, frameHeight, startx, starty);
      
      1. 创建 AVFilterGraph
      int init_filter_graph(const std::string& filter) {
             
             
      
      	filterGraph_ = avfilter_graph_alloc();
      	const AVFilter* buffersrc = avfilter_get_by_name("buffer");
      	const AVFilter* buffersink = avfilter_get_by_name("buffersink");
      	char args[512];
      	snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", frameWidth_, frameHeight_, frameFormat_, 1, videoFps_, 1, 1);
      	int ret = avfilter_graph_create_filter(&buffersrcCtx_, buffersrc, "in", args, NULL, filterGraph_);
      	if (ret < 0)
      	{
             
             
      		avfilter_graph_free(&filterGraph_);
      		filterGraph_ = NULL;
      		return -1;
      	}
      
      	// buffer video sink: to terminate the filter chain.
      	enum AVPixelFormat pix_fmts[] = {
             
              AV_PIX_FMT_YUV420P, AV_PIX_FM
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J ..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值