阅读 179

JAVACV实现视频帧添加中文水印

JAVACV实现视频帧添加中文水印

JAVACV实现视频帧添加中文水印

最近有个项目需要用到监控视频和采集数据融合显示的问题。通过各种尝试,最终确定可以使用javacv+nginx-temp来实现(类似与直播平台模式)。其中主要的一块内容是给视频叠加采集数据的问题。开始享用opencv来实现文字叠加,后来发现opencv不支持中文字符叠加~~汗汗汗。无奈支下经过各翻折腾,最终发现可以使用Graphics2D来实现给帧图片叠加中文。闲话不多说,直接进入主题。


Graphics2D是个什么东东,不用细说。就是java的一个画布工具类。细节可以问度娘。


主要实现逻辑是通过javacv调用ffmpeg获取到视频帧图片,将图片转为bufferedImage格式。然后以此bufferedImage为源做画布,将需要添加的水印文字图片添加到想要添加的位置(可以设置字体,颜色,底色,大小。图形,显示位置等等一系列操作)。然后在将此bufferedImage转为视频帧。继续生成视频流。


相关代码

Graphics2D相关

/**

* 视频帧图片加文字水印

* @param bufImg 源图片

* @param count 帧计数

* @return BufferedImage 添加水印后图片

*/

public static BufferedImage mark(BufferedImage bufImg,int count) {

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);


Font font = new Font("微软雅黑", Font.BOLD, 64);

String content = sdf.format(new Date());

String content1 = "字符滚动效果";

FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);

int width = bufImg.getWidth();//计算图片的宽

int height = bufImg.getHeight();//计算高

Graphics2D graphics = bufImg.createGraphics();

graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

//设置图片背景

graphics.drawImage(bufImg, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);

//设置左上方时间显示

graphics.setColor(Color.orange);

graphics.setFont(new Font("微软雅黑", Font.BOLD, 64));

graphics.drawString(content,  0, metrics.getAscent());

//设置下方蓝色背景条

graphics.setColor(Color.BLUE);

graphics.fillRect(0, height-110, width, 110);

//设置下方滚动字幕

graphics.setColor(Color.white);

graphics.setFont(new Font("微软雅黑", Font.BOLD, 52));

graphics.drawString(content1,  width-(count*5), height-40);

graphics.dispose();

return bufImg;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

bufferedImage相关


IplImage grabbedImage = conveter.convert(grabber.grab());

Java2DFrameConverter converter = new Java2DFrameConverter();

BufferedImage bufferedImage =converter.getBufferedImage(grabber.grabImage());

bufferedImage = mark(bufferedImage,count);

Frame frame = converter.getFrame(bufferedImage);

1

2

3

4

5

展示效果如下:




OK~完成!!!!

————————————————

版权声明:本文为CSDN博主「牟尼沟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u011936181/article/details/88655274


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐