-
2021-09-03 09:04:48
引入javacv jar包
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.6</version> </dependency>
先读取视频的每一帧,在每一帧图片上添加水印,再把每一帧图片合成为视频
import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.*; import org.bytedeco.javacv.Frame; import sun.font.FontDesignMetrics; import java.awt.*; import java.awt.image.BufferedImage; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class SubtitleMix { private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception { // 构造测试字幕 String[] test = { "世上无难事", "只怕有心人", "只要思想不滑坡", "办法总比困难多", "长江后浪推前浪", "前浪死在沙滩上" }; // 为连续的50帧设置同一个测试字幕文本 List<String> testStr = new ArrayList<>(); for (int i = 0; i < 300; i++) { testStr.add(test[i / 50]); } // 设置源视频、加字幕后的视频文件路径 FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault("E:\\BaiduNetdiskDownload\\testout.mkv"); grabber.start(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("E:\\BaiduNetdiskDownload\\outtest.mkv", grabber.getImageWidth(), grabber.getImageHeight(), 2); //grabber.getAudioChannels() // 视频相关配置,取原视频配置 recorder.setFrameRate(grabber.getFrameRate()); recorder.setVideoCodec(grabber.getVideoCodec()); recorder.setVideoBitrate(grabber.getVideoBitrate()); avutil.av_log_set_level(AV_LOG_ERROR); //设置打印日志级别 // 音频相关配置,取原音频配置 recorder.setSampleRate(grabber.getSampleRate()); recorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3); recorder.start(); System.out.println("准备开始推流..."); Java2DFrameConverter converter = new Java2DFrameConverter(); Frame frame; int i = 0; while ((frame = grabber.grab()) != null) { // 从视频帧中获取图片 if (frame.image != null) { BufferedImage bufferedImage = converter.getBufferedImage(frame); // 对图片进行文本合入 bufferedImage = addSubtitle(bufferedImage, testStr.get(i++ % 300)); // 视频帧赋值,写入输出流 frame.image = converter.getFrame(bufferedImage).image; recorder.record(frame); } // 音频帧写入输出流 if(frame.samples != null) { recorder.record(frame); } } System.out.println("推流结束..."); grabber.stop(); recorder.stop(); } /** * 图片添加文本 * * @param bufImg * @param subTitleContent * @return */ private static BufferedImage addSubtitle(BufferedImage bufImg, String subTitleContent) { // 添加字幕时的时间 Font font = new Font("微软雅黑", Font.BOLD, 32); String timeContent = sdf.format(new Date()); FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); 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(font); graphics.drawString(timeContent, 0, metrics.getAscent()); // 计算文字长度,计算居中的x点坐标 int textWidth = metrics.stringWidth(subTitleContent); int widthX = (bufImg.getWidth() - textWidth) / 2; graphics.setColor(Color.red); graphics.setFont(font); graphics.drawString(subTitleContent, widthX, bufImg.getHeight() - 100); graphics.dispose(); return bufImg; } }
转载自:https://www.cnblogs.com/wuxun1997/p/12918703.html
更多相关内容 -
Java 给图片添加水印 (simpleimage库)
2021-03-21 08:55:04先看效果: 水印可以是图片,也可以像我这样是自定义的文字需要的库:...public static void mai...先看效果:
水印可以是图片,也可以像我这样是自定义的文字
需要的库:
com.alibaba
simpleimage
1.2.3
javax.media.jai
com.springsource.javax.media.jai.core
1.1.3
javax.media.jai
com.springsource.javax.media.jai.codec
1.1.3
代码:
public static void main(String[] args) {
String url = "http://s.cn.bing.net/th?id=OHR.MetamorphicRocks_ZH-CN9753251368_1920x1080.jpg&rf=LaDigue_1920x1080.jpg";
File file = new File("C:\\Users\\Wu\\Desktop\\1.jpg");
String note = "这是测试水印这是测试水印这是测试水印这是测试水印";
save(url, file, note);
}
// 保存图片
private static void save(String srcUrl, File saveFile, String note) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//获取输入流
URL url = new URL(srcUrl);
HttpURLConnection httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
inputStream = httpUrl.getInputStream();
// 加上水印
BufferedImage bufferedImage = addWaterMark(httpUrl.getInputStream(), note);
// 输出
// 获取文件输出流
outputStream = new FileOutputStream(saveFile);
// 获取图片格式
String prefix = saveFile.getName().substring(saveFile.getName().lastIndexOf(".") + 1);
// 输出图片
ImageWriteHelper.write(new ImageWrapper(bufferedImage), outputStream, ImageFormat.getImageFormat(prefix), new WriteParameter());
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(inputStream); // 图片文件输入输出流必须记得关闭
IOUtils.closeQuietly(outputStream);
}
}
// 添加水印 第二个参数为水印的内容,为字符串
public static BufferedImage addWaterMark(InputStream in, String note) throws SimpleImageException {
// 获取照片类
ImageWrapper imageWrapper = ImageReadHelper.read(in);
// 获取水印照片包装类
ImageWrapper waterWrapper = new ImageWrapper(getWaterMask(note));
// 计算水印放在哪个位置
Point p = calculate(imageWrapper.getWidth(), imageWrapper.getHeight(), waterWrapper.getWidth(), waterWrapper.getHeight());
// 水印属性类
WatermarkParameter param = new WatermarkParameter(waterWrapper, 1f, (int) p.getX(), (int) p.getY());
// // 将水印写到图片上并返回图片Buff
return ImageDrawHelper.drawWatermark(imageWrapper.getAsBufferedImage(), param);
}
// 将文字生成为图片
private static BufferedImage getWaterMask(String text) {
Color fontColor = new Color(203, 203, 203);
Color bgColor = new Color(0, 0, 0, 178);
Font font = new Font("楷体", Font.PLAIN, 20);
int[] num = getStringWidthAndHeight(text, font);
int width = num[1]; //字符串宽度
int height = num[0]; //字符串高度
float alpha = 0.2f;
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
//得到画笔对象
Graphics2D g2d = buffImg.createGraphics();
// 添加背景色
// g2d.setColor(bgColor);
g2d.setColor(bgColor);
g2d.fillRoundRect(0, 0, width, height, 7,7);
// ---------- 增加下面的代码使得背景透明 -----------------
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g2d.dispose();
// ---------- 背景透明代码结束 -----------------
// 添加文字
g2d = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 设置颜色
g2d.setColor(fontColor);
// 设置 Font
g2d.setFont(font);
//设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明
// g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g2d.drawString(text, 0, height - 5);//居中显示
//释放资源
g2d.dispose();
// System.out.println("添加水印文字完成!");
return buffImg;
}
// 获取文字的高和宽
private static int[] getStringWidthAndHeight(String str, Font font) {
JLabel label = new JLabel();
label.setFont(font);
FontMetrics metrics;
int textH;
int textW;
label.setText(str);
metrics = label.getFontMetrics(font);
textH = metrics.getHeight();//字符串的高, 只和字体有关
textW = metrics.stringWidth(label.getText());//字符串的宽
int[] num = new int[2];
num[0] = textH;
num[1] = textW;
return num;
}
// 计算水印放的位置
private static Point calculate(int parentWidth, int parentHeight, int width, int height) {
int x = (parentWidth - (int)(parentWidth * 0.05)) - width ;
int y = (parentHeight - (int)(parentHeight * 0.1));
return new Point(x, y);
}
-
java调用ffmpeg 添加水印转换视频
2014-12-31 11:58:13java调用ffmpeg添加水印并且转换视频,代码中并没有判断哪些格式支持,那些不支持,mpg,mp4,avi,wmv基本都可以(传入格式),转换为flv avi mp4起码都没问题,其它的没事过ffmpeg是开源的支持的挺多的 补充:时间算错了,... -
如何通过javacv实现图片去水印(附代码)
2020-08-25 20:46:51主要介绍了如何通过javacv实现图片去水印(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java对图片进行添加水印操作
2022-07-16 14:41:21java封装图片加水印工具类标题java操作图片进行添加水印操作
问题核心:
每张图片的大小是不同的,所以水印字体的大小要根据图片大小来确定,通常我们要加水印的水印不止一处比如时间,地点等。所以要对水印文字进行换行操作
解决思路:
1.水印文字的字体确定:极限情况(字体大小*字数)=图片宽度,所以我的做法是:字体大小=((图片宽度)/(字数))*0.9 =>保证字体不会充满,同时如果水印字数没有超过18个就按18个字进行水印字体计算(这样可以保证水印字数过少,字体过大的问题)
2.多行水印处理:根据水印的条数对y轴进行偏移
代码演示:package com.example.hdhb.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @author Xu Ji An * @email 768212312@qq.com * 图片添加水印工具类 */ public class XuRemarkUtil { public static void main(String[] args) { List<String> markList=new ArrayList<String>(); markList.add("小米科技有限责任公司"); markList.add("山东省济南市高新技术开发区908号"); markList.add("2022 07 16 12:34"); XuRemarkUtil.pressText(markList, "C:/Users/Xu/Desktop/2/1.jpeg","C:/Users/Xu/Desktop/2/955.jpg", "宋体", Font.TYPE1_FONT,Color.red, 0.9f); } /** * 给图片添加文字水印 * @param pressTextList 水印文字(一个集合一个值对应一条水印) * @param srcImageFile 源图像地址 * @param destImageFile 目标图像地址 * @param fontName 水印的字体名称 * @param fontStyle 水印的字体样式 * @param color 水印的字体颜色 * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 */ public static void pressText(List<String> pressTextList, String srcImageFile, String destImageFile, String fontName, int fontStyle, Color color, float alpha) { try { File img = new File(srcImageFile); Image src = ImageIO.read(img); int width = src.getWidth(null); int height = src.getHeight(null); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); // 计算水印字体大小 首先找出最长的水印文字 //如果需要加水印的文字没有超过18个就按18个计算 int maxLength=18; for (String pressText : pressTextList) { if (getLength(pressText)>maxLength){ maxLength=getLength(pressText); } } //根据图片宽度计算水字体大小 int fontSize= (int) (((width)/(maxLength))*0.8); g.drawImage(src, 0, 0, width, height, null); g.setColor(color); g.setFont(new Font(fontName, fontStyle, fontSize)); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 循环在指定坐标绘制水印文字 int count=pressTextList.size(); for (String pressText : pressTextList) { //System.out.println(getLength(pressText)); g.drawString(pressText, (width - (getLength(pressText) * fontSize)) -2*fontSize, (height) -fontSize*count); count--; } g.dispose(); ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 输出到文件流 } catch (Exception e) { e.printStackTrace(); } } /** * 计算text的长度(一个中文算两个字符) * @param text * @return */ public static int getLength(String text) { int length = 0; for (int i = 0; i < text.length(); i++) { if (new String(text.charAt(i) + "").getBytes().length > 1) { length += 2; } else { length += 1; } } return length / 2; } }
运行截图:
-
java实现word文档转pdf并添加水印的方法详解
2020-08-25 14:11:24主要介绍了java实现word文档转pdf并添加水印的方法,结合实例形式详细分析了java word文档转PDF相关实现技巧与操作注意事项,需要的朋友可以参考下 -
Android视频处理之动态时间水印效果
2020-09-01 12:54:11主要A为大家详细介绍了Android视频处理之动态时间水印效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java如何给视频添加水印logo
2021-03-02 11:02:371.下载ffmpeg集成(静态)版本,解压后无需安装链接:https://pan.baidu.com/s/1-a4lDqqJDRdX99500L6lIw 密码:qp8cCmdExecuterpackage ...import java.io.BufferedReader;import java...1.下载ffmpeg集成(静态)版本,解压后无需安装
链接:https://pan.baidu.com/s/1-a4lDqqJDRdX99500L6lIw 密码:qp8c
CmdExecuter
package com.amigo.online.provider.manager.util.video.processing;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
public class CmdExecuter {
public static String exec(Listcmd) {
String converted_time = null;
Process proc =null;
BufferedReader stdout = null;
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(cmd);
builder.redirectErrorStream(true);
proc = builder.start();
stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
int lineNumber=1;
ListreturnStringList = new LinkedList();
while ((line = stdout.readLine()) != null) {
System.out.println("第"+lineNumber+"行:"+line);
lineNumber=lineNumber+1;
returnStringList.add(FFMPEG.dealString(line));
}
String info = "";
for (int i = returnStringList.size() - 1; i >= 0; i--) {
if (null != returnStringList.get(i) && returnStringList.get(i).startsWith("frame=")) {
info = returnStringList.get(i);
break;
}
}
if (null != info) {
converted_time = info.split("time=")[1].split("bitrate=")[0].trim();
}
} catch (IndexOutOfBoundsException ex) {
converted_time = null;
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
proc.waitFor();
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return converted_time;
}
}
FFMPEG
package com.amigo.online.provider.manager.util.video.processing;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FFMPEG {
public static String dealString( String str ){
Matcher m=java.util.regex.Pattern.compile("^frame=.*" ).matcher(str);
String msg="";
while (m.find()){
msg = m.group();
}
return msg;
}
/**
* 如果是数字就是成功的时间(秒数)
* @param str
* @return
*/
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
/**
* 如果返回不是null的值就是成功(值为转换用时单位:秒)
* @param instr
* @return
*/
public static String returnSecond(String instr){
String returnValue=null;
if (null!=instr) {
String[] a=instr.split("\\.");
String[] b=a[0].split(":");
int returnNumber=0;
if (null!=instr&&b[0].length()!=0) {
returnNumber=Integer.valueOf(b[0])*60*60 + Integer.valueOf(b[1])*60 + Integer.valueOf(b[2]);
returnValue=String.valueOf(returnNumber);
}else{
returnValue=null;
}
}
return returnValue;
}
/**
* 获取视频格式(转码前的格式和转码后的格式都可以调用)
* @param outputPath
* @return
*/
public static String returnVideoFormat(String outputPath){
return outputPath.substring(outputPath.lastIndexOf(".")+1);
}
/**
* @ HashMapdto 参数传递对象
* dto中包含的参数
* (必填)1.ffmpeg_path:ffmpeg执行文件地址,如 d:\\ffmpeg\\ffmpeg.exe Linux下直接调用ffmpeg命令(当然你事先已经有这个程序了)
* (必填)2.input_path:原视频路径
* (必填)3.video_converted_path:转换后视频输出路径
* (可选)4.screen_size:视频尺寸 长度乘宽度 乘号用英文小写"x"如 512x480
* (可选)5.logo:水印地址(其实在ffmpeg中有一个专门的watermark参数,logo跟它有何不同,我还没看,不过对我来说效果一样 貌似需要png图片才行)
* (可选,如果填写必须有logo才行,默认为0)6.xaxis:水印logo的横坐标(只有logo参数为一个正确路径才行) 比如0
* (可选,如果填写必须有logo才行,默认为0)6.yaxis:水印logo的纵坐标(只有logo参数为一个正确路径才行) 比如0
* (可选)vb:视频比特率,传入一个数值,单位在程序里面拼接了k
* (可选)ab:音频比特率,传入一个数值,单位在程序里面拼接了k
*/
public String videoTransfer(HashMapdto){
// String ffmpeg_path,String input_path,String video_converted_path,String logo,String screen_size,String xaxis,String yaxis,String vb,String ab
Listcmd = new ArrayList();
cmd.add(dto.get("ffmpeg_path"));
cmd.add("-y");
cmd.add("-i");
cmd.add(dto.get("input_path"));
if (null!=dto.get("screen_size")) {
cmd.add("-s");
cmd.add(dto.get("screen_size"));
}
if (null!=dto.get("logo")) {
String logo=dto.get("logo");
cmd.add("-vf");
String xaxis=dto.get("xaxis");
String yaxis=dto.get("yaxis");
xaxis=xaxis!=null&&!xaxis.equals("")?xaxis:"0";
yaxis=yaxis!=null&&!yaxis.equals("")?yaxis:"0";
String logoString="movie="+logo+"[logo],[in][logo]overlay=x="+xaxis+":y="+yaxis+"[out]";
cmd.add(logoString);
}
cmd.add("-strict");
cmd.add("-2");
if (null!=dto.get("vb")&&!dto.get("vb").equals("")) {
cmd.add("-vb");
cmd.add(dto.get("vb")+"k");
}
if(null!=dto.get("ab")&&!dto.get("ab").equals("")){
cmd.add("-ab");
cmd.add(dto.get("ab")+"k");
}
cmd.add("-q:v");
cmd.add("4");
cmd.add(dto.get("video_converted_path"));
String converted_time= CmdExecuter.exec(cmd);
return returnSecond(converted_time);//获取转换时间
}
public static void main(String [] arg){
HashMapdto=new HashMap();
dto.put("ffmpeg_path", "E:\\lwl\\ffmpegUtil\\ffmpeg-20180714-c5329d6-win64-static\\bin\\ffmpeg.exe");//必填
dto.put("input_path", "D:\\image\\777.mp4");//必填
dto.put("video_converted_path", "D:\\image\\video\\gg.mp4");//必填
dto.put("logo", "D\\\\:/image/createImage.jpg");//可选(注意windows下面的logo地址前面要写4个反斜杠,如果用浏览器里面调用servlet并传参只用两个,如 d:\\:/ffmpeg/input/logo.png)
String secondsString= new FFMPEG().videoTransfer(dto);
System.out.println("转换共用:"+secondsString+"秒");
}
}
VideoThumbTaker
package com.amigo.online.provider.manager.util.video.processing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class VideoThumbTaker {
protected String ffmpegApp;
public VideoThumbTaker(String ffmpegApp)
{
this.ffmpegApp = ffmpegApp;
}
@SuppressWarnings("unused")
/****
* 获取指定时间内的图片
* @param videoFilename:视频路径
* @param thumbFilename:图片保存路径
* @param width:图片长
* @param height:图片宽
* @param hour:指定时
* @param min:指定分
* @param sec:指定秒
* @throws IOException
* @throws InterruptedException
*/
public void getThumb(String videoFilename, String thumbFilename, int width,
int height, int hour, int min, float sec) throws IOException,
InterruptedException
{
ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y",
"-i", videoFilename, "-vframes", "1", "-ss", hour + ":" + min
+ ":" + sec, "-f", "mjpeg", "-s", width + "*" + height,
"-an", thumbFilename);
Process process = processBuilder.start();
InputStream stderr = process.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null)
;
process.waitFor();
if(br != null)
br.close();
if(isr != null)
isr.close();
if(stderr != null)
stderr.close();
}
}
-
用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
2021-02-25 19:06:42这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为实现功能:①给图片增加文字水印②给图片增加图片水印一、核心功能实现:1、添加文字水印// 加文字水印public ... -
用java实现对视频添加水印的代码或思路
2021-02-25 19:06:42展开全部package ...import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.FileInputStream;import java.io.FileNotFoundExcept... -
Java 阿里云图片添加水印
2022-04-06 14:45:34图片已经上传阿里云,打完文字水印后重新上传,顶替原图片 public void watermark(){ // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM... -
Android使用Opengl录像时添加水印
2020-08-19 09:34:18主要为大家详细介绍了Android使用Opengl录像时添加水印,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
android YUV 方式添加水印
2018-10-31 15:22:55通过java api进行添加水印, 效率太慢, 现通过ndk的方式, 用YUV的方式进行水印添加, 简单高效. -
java添加水印和oss图片加水印的两种方法
2020-09-12 15:01:57java添加文字/图片水印并设置水印位置和旋转角度 阿里云oss方式一:图片的后缀拼接>官方文档<阿里云支持的方式,推荐 阿里云oss方式二:上传时加水印 java添加文字/图片水印并设置水印位置和旋转角度 ... -
Java实现视频添加图片水印并且将视频上传到云服务器返回视频的URL
2022-03-18 14:43:38Java实现视频添加图片水印并且将视频上传到云服务器返回视频的URL 实现思路: 前段时间接了一个需求就是小程序那边分享动态的时候 会分享自己的一些图片或者是视频 而我需要做的就是把客户上传的视频或者是图片都... -
java 批量为图片添加图标水印和文字水印
2020-07-03 17:19:20需求,给指定目录下面以.jpg结尾的文件,添加图标水印和文字水印 package com.gblfy.util; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import javax.imageio... -
opencv for java给图片添加水印中文问题
2022-04-03 22:09:22opencv提供的给图片添加文字的方法Imgproc.putText()可以给图片添加文字,最后类似一个添加水印的效果,但是这个方法对中文支持不好,在没有字体支持的情况下,默认中文显示?。如下图所示: 代码如下: ... -
JAVA 图片Graphics2D添加水印
2021-08-18 16:13:55... import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*;...import java.awt.image.BufferedImage;...import java.io.*;...import java.nio.charset -
java POI为excel添加水印
2020-05-06 14:38:19网络上充斥着各种为excel添加水印的方法,但是多数效果不敢恭维,这里介绍两种添加excel水印的方法,最终实现的效果跟excel工具添加的水印无异,个人比较喜欢比较推荐。 这里说是两种,其实原理是一种,只不过因为... -
JAVA图片水印开发案例详解
2020-08-29 23:26:54水印开发是web开发中一种比较常见的功能,实现的代码很简单,这篇文章主要介绍了JAVA图片水印开发案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java实现word文档转pdf,并添加水印
2021-02-28 16:42:02java实现word文档转pdf,并添加水印发布时间:2018-08-01 17:21,浏览次数:1115, 标签:javawordpdf前段时间,项目需要自动生成word文档,用WordFreeMarker生成word文档后,又要求生成的文档能在浏览器浏览,... -
Android拍照和录像添加水印Demo
2018-03-06 10:04:10拍照和录像时添加时间水印,时间使用的是服务器时间不可更改! -
javacv 视频增加水印
2021-04-19 14:09:14前言:最近项目需要在视频中增加时间水印,网上查询几篇博客发现可以增加水印但是音频丢失,无奈自己还是查看源码渡劫吧。 1、工程pom文件添加依赖 <dependency> <groupId>org.bytedeco</groupId... -
使用imgIo技术包用java程序将图片添加水印,并防止图片文字水印溢出
2021-12-01 17:47:19public static void waterPress(File srcImgFile, Color markContentColor,... //将String水印分为三份,既三行,分别是时间,位置信息,还有坐标经纬度 String[] waterMarkContents = waterMarkContent.split("\\|\\|"); -
java FFMPEG调取usb摄像头,截取视频,添加文字和时间水印
2021-11-16 14:57:16最近工作中接触到了视频监控这块东西,最开始使用的是海康摄像头,因为有文档还有技术对接,做起来基本还算顺利,但是后来需求要求支持usb摄像头,最开始百度了一圈,用啥opencv javacv之类的技术,感觉都挺麻烦的,... -
Java针对不同文件加水印
2022-03-10 10:08:09需求需要对不同文件加水印,例如:jpg,png,pdf,word 由于不同文件不同的方式,所以进行逐个功能开发 调研 图片文件(jpg,png,e.g.):通过ImageIO PDF:1.itextpdf 2.pdfbox Word:1.通过Free Spire for Doc 2.... -
android 拍照加时间水印(以及图片)
2017-06-20 13:07:18android 拍照加时间水印(以及图片)demo,含详细注解 -
java 使用itextpdf添加自适应页面水印代码
2022-08-01 19:08:47代码】java使用itextpdf添加自适应页面水印代码。 -
如何用java给图片添加图片水印(透明度、旋转、居中)?
2020-05-06 15:08:47最近在做一个食品溯源项目,需要对一些图片加上水印。 注释都在代码里了,有啥想法可以在评论区交流(๑•ᴗ•๑)~ ... * 给图片添加水印图片、可设置水印图片旋转角度 * * @param iconPath 水印图片路径 * @p...