Java实现视频与图片添加水印

这篇具有很好参考价值的文章主要介绍了Java实现视频与图片添加水印。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java实现视频与图片添加水印

1、需要引入javacv依赖

 <!-- javacv  -->
 <dependency>
     <groupId>org.bytedeco</groupId>
     <artifactId>javacv-platform</artifactId>
     <version>1.5.4</version>
 </dependency>

2、代码实现


import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameUtils;
import org.bytedeco.opencv.opencv_core.IplImage;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

/**
* 自定义文字加水印(支持图片与视频)
*/
@Slf4j
public class WaterMarkUtils {

    /**
     * 水印字体
     */
    private static final Font FONT = new Font("Microsoft Yahei", Font.BOLD, 40);
    /**
     * 透明度
     */
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
    /**
     * 水印之间的间隔
     */
    private static final int X_MOVE = 300;
    /**
     * 水印之间的间隔
     */
    private static final int Y_MOVE = 140;

    /**
     * 图片打水印(文字)
     *
     * @param srcImgPath       源文件地址
     * @param waterMarkContent 水印内容
     * @param outImgPath       输出文件的地址
     */
    public static void markWithContentByImage(String srcImgPath,String waterMarkContent,String outImgPath) {

        try {
            Color markContentColor = new Color(180,180,180);
            // 读取原图片信息
            File srcFile = new File(srcImgPath);
            File outFile = new File(outImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);
            // 图片宽、高
            int imgWidth = srcImg.getWidth();
            int imgHeight = srcImg.getHeight();
            // 图片缓存
            BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
            // 创建绘图工具
            Graphics2D graphics = bufImg.createGraphics();
            // 画入原始图像
            graphics.drawImage(srcImg, 0, 0, imgWidth, imgHeight, null);
            // 设置水印颜色
            createText(markContentColor, waterMarkContent, bufImg, imgWidth, imgHeight, graphics);
            // 输出图片
            try (FileOutputStream fos = new FileOutputStream(outFile);){
                ImageIO.write(bufImg, "jpg", fos);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 视频打水印(文字)
     *
     * @param inputPath       源文件地址
     * @param waterMarkContent 水印内容
     * @param outputPath       输出文件的地址
     */
    public static void markWithContentByVideo(String inputPath, String waterMarkContent, String outputPath) {
        long l = System.currentTimeMillis();
        File file = new File(inputPath);
        // 抓取视频资源
        Frame frame;
        try(FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file)){
            log.info("文件名-->>" + outputPath);
            frameGrabber.start();
            try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels())){
                recorder.setFormat("mp4");
                recorder.setSampleRate(frameGrabber.getSampleRate());
                recorder.setFrameRate(frameGrabber.getFrameRate());
                recorder.setTimestamp(frameGrabber.getTimestamp());
                recorder.setVideoBitrate(frameGrabber.getVideoBitrate());
                recorder.setVideoCodec(frameGrabber.getVideoCodec());
                recorder.start();
                Color markContentColor = new Color(180,180,180);
                while (true){
                    frame = frameGrabber.grabFrame();
                    if(frame == null){
                        log.info("视频处理完成");
                        break;
                    }
                    //判断图片帧
                    if(frame.image != null){
                        IplImage iplImage = Java2DFrameUtils.toIplImage(frame);
                        BufferedImage bufImg = Java2DFrameUtils.toBufferedImage(iplImage);
                        int imgWidth = iplImage.width();
                        int imgHeight = iplImage.height();
                        // 加水印
                        Graphics2D graphics = bufImg.createGraphics();
                        // 创建绘图工具
                        createText(markContentColor, waterMarkContent, bufImg, imgWidth, imgHeight, graphics);

                        Frame newFrame = Java2DFrameUtils.toFrame(bufImg);
                        recorder.record(newFrame);
                    }
                    //设置音频
                    if(frame.samples != null){
                        recorder.recordSamples(frame.sampleRate,frame.audioChannels,frame.samples);
                    }
                }
                recorder.stop();
                recorder.release();
                frameGrabber.stop();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private static void createText(Color markContentColor, String waterMarkContent, BufferedImage bufImg, int imgWidth, int imgHeight, Graphics2D graphics) {
        // 设置水印颜色
        graphics.setColor(markContentColor);
        // 设置水印透明度
        graphics.setComposite(COMPOSITE);
        // 设置倾斜角度
        graphics.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2,
                (double) bufImg.getHeight() / 2);
        // 设置水印字体
        graphics.setFont(FONT);
        // 消除java.awt.Font字体的锯齿
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        int xCoordinate = -imgWidth / 2;
        int yCoordinate;
        // 字体长度
        int markWidth = FONT.getSize() * getTextLength(waterMarkContent);
        // 字体高度
        int markHeight = FONT.getSize();
        // 循环添加水印
        double d = 1.5;
        while (xCoordinate < imgWidth * d) {
            yCoordinate = -imgHeight / 2;
            while (yCoordinate < imgHeight * d) {
                graphics.drawString(waterMarkContent, xCoordinate, yCoordinate);
                yCoordinate += markHeight + Y_MOVE;
            }
            xCoordinate += markWidth + X_MOVE;
        }
        // 释放画图工具
        graphics.dispose();
    }


    /**
    * 计算水印文本长度
     * 1、中文长度即文本长度 2、英文长度为文本长度二分之一
     * @param text 文字
    * @return int
    */
    public static int getTextLength(String text) {
        // 水印文字长度
        int length = text.length();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }


    public static void main(String[] args) {
//        markWithContentByImage("C:\\Users\\1691479135504.png",
//                "测试水印","C:\\Users\\16914791355041.png");
        markWithContentByVideo("C:\\Users\\test.mp4",
                "测试水印","C:\\Users\\test1.mp4");
    }
}

文章来源地址https://www.toymoban.com/news/detail-767303.html

到了这里,关于Java实现视频与图片添加水印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ueditor上传图片自动添加水印(通用图片文件)

    1、找到config.json,在配置文件中新增水印效果  2、找到php目录下的 action_uploads.php 文件 3、找到php同级目录下的类 uploadser.class.php    注意:以上代码会提示一个错误 imagealphablending() expects parameter 1 to be resource imagesavealpha() expects parameter 1 to be resource 在这个位置: 这个错误是因

    2024年02月12日
    浏览(39)
  • JAVA PDF 给PDF添加文字/图片水印(指定内容),并且设置位置

    提示:看完这个简单的demo 后就知道怎样去操作一个PDF了 文章目录 前言 一、前提准备 二、使用步骤 1.引入库 2.以下是部分代码的作用 总结 提示:操作PDF其实是一件很简单的事情,比一般的CRUD都简单 例如:我们拿到了一个需求,我需要给这个PDF设置一个 电子签名 ( 就是一

    2024年04月23日
    浏览(37)
  • Qt音视频开发47-文字和图片水印(可存储到MP4中)

    近期花了两周时间闭门啃硬骨头,主要就解决三个问题(音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流),这三个问题困扰了很多年,以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的代码,通过不下于上百次方案的调整和测试,几乎每次都是

    2024年02月16日
    浏览(32)
  • Moviepy模块之视频添加图片水印

    大家好,我是空空star,本篇给大家分享一下Moviepy模块之视频添加图片水印。 本篇使用的moviepy版本如下: Name: moviepy Version: 1.0.3 5.1 相对于视频的左上角 5.2 相对于视频的左下角 5.3 相对于视频的右上角 5.4 相对于视频的右下角 5.5 相对于视频的左中位置 5.6 相对于视频的正中位

    2023年04月08日
    浏览(26)
  • ffmpeg 给视频或者图片添加水印和马赛克的方法

    可以使用 FFmpeg 给视频或图片添加水印和马赛克。以下是具体方法: 添加水印 如果需要给视频添加水印,可以使用 overlay 滤镜。该滤镜将两个输入叠加在一起,即将视频和水印画面结合在一起。以下是一个简单的例子: 其中 -i input.mp4 表示指定输入文件, -i watermark.png 表示指

    2024年02月16日
    浏览(33)
  • java实现pdf文件添加水印,下载到浏览器

    添加itextpdf依赖 根据需求,不需要指定路径可以删除对应的输出流 效果如下:代码中的相对路径在src平级目录下,test.pdf是PdfStamper里面fileOutputStream生成的,test1.pdf是fos生成的 浏览器下载的如下: 生成的pdf内容如下(红框里面是pdf原来的内容,可以自己调整代码中注释掉的设

    2024年02月05日
    浏览(39)
  • 使用Java实现去除和屏蔽视频水印

    使用Java实现去除和屏蔽视频水印 在视频编辑和处理过程中,常常会遇到需要去除或屏蔽视频水印的需求。水印是一种在视频中插入的标识,通常用于版权保护或品牌展示。然而,有时候我们希望在编辑或分享视频时去除这些水印,以获得更干净和专业的效果。本文将介绍如

    2024年03月15日
    浏览(32)
  • 上传图片和视频在JAVA上的运用

    Java图像和视频上传 Cloudinary提供了一个API,用于将图像、视频和任何其他类型的文件上传到云端。上传到Cloudinary的文件通过安全备份和修订历史记录安全存储在云中。Cloudinary的API允许从您的服务器、直接从访问者的浏览器或移动应用程序或通过远程公共URL获取安全上传。

    2023年04月17日
    浏览(28)
  • 使用JavaScript给图片添加图片水印的前端实现方法

    当涉及图片处理时,JavaScript是一种强大的工具。在本篇博客中,我们将学习如何使用JavaScript来给图片添加水印,并将其封装成一个函数,以便在需要的时候重复使用。 在开始之前,确保你已经准备好了以下内容:         1.一张待添加水印的图片。         2.水印图片。

    2024年03月15日
    浏览(45)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 一、简单介绍 二、简单给视频添加水印图片效果实现原理 三、简单给视频添加水印图片效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语

    2024年04月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包