加视频和文本水印

   * @param multipartFile 文件* @param fileName 水印名字* @param fileType 1 代表图片 其它代表水印* @return 结果*/@Overridepublic String importSave(MultipartFile multipartFile, String fileName,String fileType,String fileUrl) {Assert.notNull(fileName,"水印名称不能为空");Assert.notNull(fileType,"文件类型不能为空");IAOssService service = SpringUtils.getBean(IAOssService.class);AOss oss = service.getCurrentOss();InputStream inputStream = null;try {if (oss.getCurrentType().equals("0")){CredentialsProvider credentialsProvider = new DefaultCredentialProvider(oss.getAppId(), oss.getAppKey());// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(oss.getOssUrl(), credentialsProvider);OSSObject object = ossClient.getObject(oss.getOssName(), fileUrl);if (StringUtils.isEmpty(fileUrl)){inputStream = multipartFile.getInputStream();}else {inputStream = object.getObjectContent();}}ByteArrayOutputStream  baos = new ByteArrayOutputStream();/*走图片水印*/if (ConstantClass.IS_PUBLIC1.equals(fileType)){BufferedImage img = ImageIO.read(inputStream);BufferedImage newImg= new BufferedImage(img.getWidth(),img.getHeight(),BufferedImage.TYPE_INT_RGB);newImg.getGraphics().drawImage(img, 0, 0, null);int width = newImg.getWidth();int height = newImg.getHeight();int fontSize = (width+height) / 40;Graphics2D g = newImg.createGraphics();Color color = new Color(0, 255, 149);g.setColor(color);g.setFont(new Font("黑体", Font.PLAIN, fontSize));g.drawString(fileName, width - GetStrWidthUtis.getStrWidth(fileName, fontSize) - 30, height - 30);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.9f));g.dispose();ImageIO.write( newImg, "jpg", baos );//转换为MultipartFileRandom random = new Random();int nextInt = random.nextInt();MultipartFile multipartFiles = new MockMultipartFile(nextInt+".jpg",fileName,"image/png",baos.toByteArray());String upload = FileUploadUtils.upload(multipartFiles);inputStream.close();baos.close();return  upload;}else {/*走视频水印*/try {Map ByEmail = GetStrWidthUtis.markWithContentByVideo(inputStream, fileName, "文化路径未使用");Object file1 = ByEmail.get("file");Object file2 = ByEmail.get("fileInputStream");Object file13= ByEmail.get("byte");File pdfFile  = (File) file1;FileInputStream fileInputStream = new FileInputStream(pdfFile);MultipartFile multipartFileS = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);// InputStream inputStreamStream = new ByteArrayInputStream(ByEmail);//MultipartFile file = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStreamStream);/*s上传阿里云OSS*/String upload = FileUploadUtils.upload(multipartFileS);inputStream.close();fileInputStream.close();return upload;}catch (Exception e){return e+"视频流异常";}}}catch (Exception e){return e+"水印接口异常";}}

工具类: GetStrWidthUtis


import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.uuid.UUID;
import org.apache.http.entity.ContentType;
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 org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;public class GetStrWidthUtis {/*** 获取字符串占用的宽度* <br>* @param str		字符串* @param fontSize	文字大小* @return 字符串占用的宽度*/public static int getStrWidth(String str, int fontSize) {char[] chars = str.toCharArray();int fontSize2 = fontSize / 2;int width = 0;for (char c : chars) {int len = String.valueOf(c).getBytes().length;// 汉字为3,其余1// 可能还有一些特殊字符占用2等等,统统计为汉字if (len != 1) {width += fontSize;} else {width += fontSize2;}}return width;}public static MultipartFile file2MultipartFile(File file){MultipartFile multipartFile = null;try(FileInputStream fileInputStream = new FileInputStream(file)) {multipartFile = new MockMultipartFile(file.getName(), file.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);} catch (Exception e) {System.out.println(e);}return multipartFile;}public static void main(String[] args) throws IOException {FileInputStream stream = new FileInputStream(new File("C:\\Users\\gf\\Videos\\IMG_2656_20240620100811A200.mp4"));Map video = markWithContentByVideo(stream, "测试水印", null);
//        new FileOutputStream("C:\\Users\\gf\\Videos\\IMG_2656_20240620100811A200_1.mp4").write(video);}/*视频水印方法*//*** 视频打水印(文字)** @param fieldName  文件路径  未使用* @param waterMarkContent 水印内容* @param inputStream 文件流*/public static Map markWithContentByVideo(InputStream inputStream , String waterMarkContent, String fieldName ) {long l = System.currentTimeMillis();// 抓取视频资源org.bytedeco.javacv.Frame frame = new org.bytedeco.javacv.Frame();try  {FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(inputStream);frameGrabber.start();Random random = new Random();int i = random.nextInt();File file = new File(UUID.fastUUID().toString(true) + ".mp4");try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file,frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels())) {recorder.setFormat(frameGrabber.getFormat());recorder.setSampleRate(frameGrabber.getSampleRate());recorder.setFrameRate(frameGrabber.getFrameRate());recorder.setTimestamp(frameGrabber.getTimestamp());recorder.setVideoBitrate(frameGrabber.getVideoBitrate());recorder.setVideoCodec(frameGrabber.getVideoCodec());recorder.setAudioCodec(frameGrabber.getAudioCodec());recorder.setAudioBitrate(frameGrabber.getAudioBitrate());recorder.start();Color markContentColor = new Color(180, 180, 180);while (true) {frame = frameGrabber.grabFrame();if (frame == null) {System.out.println("视频处理完成");break;}//判断图片帧if (frame.image != null) {IplImage iplImage = Java2DFrameUtils.toIplImage(frame);BufferedImage bufImg = Java2DFrameUtils.toBufferedImage(iplImage);int imgWidth = iplImage.width();int imgHeight = iplImage.height();int fontSize = (imgWidth + imgHeight) / 40;// 加水印Graphics2D graphics = bufImg.createGraphics();Color color = new Color(0, 255, 149);graphics.setColor(color);graphics.setFont(new Font("黑体", Font.PLAIN, fontSize));graphics.drawString(waterMarkContent, imgWidth - getStrWidth("imgWidth", fontSize) - 30, imgHeight - 30);graphics.dispose();
//                        // 创建绘图工具
//                        createText(markContentColor, waterMarkContent, bufImg, imgWidth, imgHeight, graphics);Frame frame1 = Java2DFrameUtils.toFrame(bufImg);recorder.record(frame1);}//设置音频if (frame.samples != null) {recorder.recordSamples(frame.sampleRate, frame.audioChannels, frame.samples);}}recorder.stop();recorder.release();frameGrabber.stop();FileInputStream fileInputStream = new FileInputStream(file);byte[] bytes = new byte[fileInputStream.available()];fileInputStream.read(bytes);file.deleteOnExit();Map<String, Object> stringObjectHashMap = new HashMap<>();stringObjectHashMap.put("byte",bytes);stringObjectHashMap.put("fileInputStream",fileInputStream);stringObjectHashMap.put("file",file);return stringObjectHashMap;}} catch (Exception e) {e.printStackTrace();return null;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1489352.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

mfc100u.dll 文件缺失?两种方法快速修复丢失mfc100u.dll 文件难题

您的电脑是否遭遇了 mfc100u.dll 文件缺失的问题&#xff1f;这种情况通常由多种原因引起。在本文中&#xff0c;我们将介绍两种修复 mfc100u.dll 文件丢失问题的策略——一种是手动方法&#xff0c;另一种是自动修复的使用。我们将探讨如何有效地解决 mfc100u.dll 文件缺失的几…

CAS算法

CAS算法 1. CAS简介 CAS叫做CompareAndSwap&#xff0c;比较并交换&#xff0c;主要是通过处理器的指令来保证操作的原子性。 CAS基本概念 内存位置 (V)&#xff1a;需要进行CAS操作的内存地址。预期原值 (A)&#xff1a;期望该内存位置上的旧值。新值 (B)&#xff1a;如果旧…

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…

(8) ubuntu ROS 安装

文章目录 安装流程1. 进入ros官网2. 根据自己ubuntu系统选择版本&#xff08;我是20.04的ubuntu&#xff09;3.根据流程开始安装3.1 设置sources.list 4.验证ros5.安装rosdep 安装流程 1. 进入ros官网 https://www.ros.org/ 2. 根据自己ubuntu系统选择版本&#xff08;我是2…

排查C++软件异常的常见思路与方法(实战经验总结)

目录 1、概述 2、常用的C++异常排查思路与方法 2.1、IDE调试 2.1.1、Debug和Release下的调试 2.1.2、VS附加到进程调试 2.1.3、Windbg附加到进程调试 2.2、添加日志打印 2.3、分块注释代码 2.4、数据断点 2.5、历史版本比对法 2.6、Windbg静态分析与动态调试 2.6.1…

如何发现快速发现分析生产问题SQL

Performance Schema介绍 Performance Schema提供了有关MySQL服务器内部运行的操作上的底层指标。为了解释清楚Performance Schema的工作机制&#xff0c;先介绍两个概念。 第一个概念是程序插桩&#xff08;instrument&#xff09;。程序插桩在MySQL代码中插入探测代码&#xf…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种&#xff1a; 本地模式&#xff0c;默认的模式&#xff0c;无需运行任何守护进程&#xff08; daemon &#xff09;&#xff0c;所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

鸿蒙开发——axios封装请求、拦截器

描述&#xff1a;接口用的是PHP&#xff0c;框架TP5 源码地址 链接&#xff1a;https://pan.quark.cn/s/a610610ca406 提取码&#xff1a;rbYX 请求登录 HttpUtil HttpApi 使用方法

PHP8.3.9安装记录,Phpmyadmin访问提示缺少mysqli

ubuntu 22.0.4 腾讯云主机 下载好依赖 sudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config libbz2-dev libreadline-dev libicu-dev libsqlite3-dev libwebp-dev 下载php8.3.9安装包 nullhttps://www.php.net/d…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…

java计算机毕设课设—记账管理系统(附源码和安装视频)

这是什么系统&#xff1f; java计算机毕设课设—记账管理系统&#xff08;附源码和安装视频&#xff09; 记账管理系统主要用于财务人员可以从账务中判断公司的发展方向。对个人和家庭而言&#xff0c;通过记账可以制定日后的 消费计划&#xff0c;这样才能为理财划出清晰合理…

Scrapy 爬取旅游景点相关数据(三)

这一节我们将之前爬取到的景点数据进行解析&#xff0c;并且保存为excel&#xff0c;便于后续使用&#xff0c;本节包含 &#xff08;1&#xff09; 景点数据解析 &#xff08;2&#xff09;数据保存到excel 1 编写爬虫 这次继续改进第二节的爬虫&#xff0c;新建一个爬虫文…

【Java基础】动态代理与代理模式哪些事儿

文章目录 代理静态代理动态代理基于接口的jdk动态的demo源码解析Proxy.newProxyInstancejdk 动态的生成的字节码 基于父类的cglib动态代理源码解析 代理设计模式应用场景 Spring AOP小结 代理 代理其实就是扩展目标对象的功能&#xff0c;比如普通人不具备超人能力&#xff0c…

青少年绘画大赛兰州站:童梦起航 致敬科学 续写降压0号之父强国梦

2024年7月21日&#xff0c;“鹤舞童梦致敬科学精神”青少年绘画大赛在兰州隆重启幕。 活动邀请了多位重量级嘉宾担任评委&#xff0c;包括中国美术家协会会员、甘肃省油画协会常务理事马爱兵&#xff0c;兰州交通大学天佑美术馆馆长王欣&#xff0c;以及国家一级美术师蔡晓斌。…

什么是护网?2024护网行动怎么参加?一文详解_护网具体是做啥的

前言 最近的全国护网可谓是正在火热的进行中&#xff0c;有很多网安小白以及准大一网安的同学在后台问我&#xff0c;到底什么是护网啊&#xff1f;怎么参加呢&#xff1f;有没有相关的学习资料呢&#xff1f;在下不才&#xff0c;连夜整理出来了这篇护网详解文章&#xff0c;希…

Linux笔记 --- 基础指令

1.了解命令行 快捷键打开终端&#xff1a;altctrlT 2.入门命令 1&#xff09;cd 切换工作路径&#xff0c;使用时直接在后面写下当前目录下的下级目录即可跳转&#xff0c;也有特殊用法&#xff0c;在此列出 2&#xff09;ls ls 列举当前目录下的内容常见用法有两种&#xff…