用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

javaCV图像处理系列:

javaCV图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制

  

前言:

这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为

实现功能:①给图片增加文字水印②给图片增加图片水印

一、核心功能实现:

1、添加文字水印

[java]  view plain  copy
  1. // 加文字水印  
  2.     public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {  
  3.         Graphics2D g = bufImg.createGraphics();  
  4.         g.drawImage(img, 00, bufImg.getWidth(), bufImg.getHeight(), null);  
  5.         g.setColor(color);  
  6.         g.setFont(font);  
  7.         g.drawString(text, x, y);  
  8.         g.dispose();  
  9.     }  

2、添加图片水印

[java]  view plain  copy
  1. // 加图片水印  
  2.     public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) {  
  3.         Graphics2D g = bufImg.createGraphics();  
  4.         g.drawImage(img, 00, bufImg.getWidth(), bufImg.getHeight(), null);  
  5.         g.drawImage(markImg, x, y, width, height, null);  
  6.         g.dispose();  
  7.     }  


以上两个方法实现了最核心的功能:给图片添加水印。

补充:

为什么要这么写?

考虑到该方法不仅可以用于给图片文件增加水印,而且还可以给视频的每一帧图像也添加,所以为了方便不同场合重复使用,去除了不必要的依赖关系。

有了核心的两个方法就我们可以给图片文件增加水印了

二、功能性实现

1、给图片增加文字水印

[java]  view plain  copy
  1. /** 
  2.      * 给图片增加文字水印 
  3.      *  
  4.      * @param imgPath 
  5.      *            -要添加水印的图片路径 
  6.      * @param outImgPath 
  7.      *            -输出路径 
  8.      * @param text-文字 
  9.      * @param font 
  10.      *            -字体 
  11.      * @param color 
  12.      *            -颜色 
  13.      * @param x 
  14.      *            -文字位于当前图片的横坐标 
  15.      * @param y 
  16.      *            -文字位于当前图片的竖坐标 
  17.      */  
  18.     public void mark(String imgPath, String outImgPath, String text, Font font, Color color, int x, int y) {  
  19.         try {  
  20.             // 读取原图片信息  
  21.             File imgFile = null;  
  22.             Image img = null;  
  23.             if (imgPath != null) {  
  24.                 imgFile = new File(imgPath);  
  25.             }  
  26.             if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) {  
  27.                 img = ImageIO.read(imgFile);  
  28.             }  
  29.             int imgWidth = img.getWidth(null);  
  30.             int imgHeight = img.getHeight(null);  
  31.             // 加水印  
  32.             BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);  
  33.             mark(bufImg, img, text, font, color, x, y);  
  34.             // 输出图片  
  35.             FileOutputStream outImgStream = new FileOutputStream(outImgPath);  
  36.             ImageIO.write(bufImg, "jpg", outImgStream);  
  37.             outImgStream.flush();  
  38.             outImgStream.close();  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.     }  


2、给图片增加图片水印

[java]  view plain  copy
  1. /** 
  2.      * 给图片增加图片水印 
  3.      *  
  4.      * @param inputImg 
  5.      *            -源图片,要添加水印的图片 
  6.      * @param markImg 
  7.      *            - 水印图片 
  8.      * @param outputImg 
  9.      *            -输出图片(可以是源图片) 
  10.      * @param width 
  11.      *            - 水印图片宽度 
  12.      * @param height 
  13.      *            -水印图片高度 
  14.      * @param x 
  15.      *            -横坐标,相对于源图片 
  16.      * @param y 
  17.      *            -纵坐标,同上 
  18.      */  
  19.     public void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) {  
  20.         // 读取原图片信息  
  21.         File inputImgFile = null;  
  22.         File markImgFile = null;  
  23.         Image img = null;  
  24.         Image mark = null;  
  25.         try {  
  26.             if (inputImg != null && markImg != null) {  
  27.                 inputImgFile = new File(inputImg);  
  28.                 markImgFile = new File(markImg);  
  29.             }  
  30.             if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) {  
  31.   
  32.                 img = ImageIO.read(inputImgFile);  
  33.   
  34.             }  
  35.             if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) {  
  36.   
  37.                 mark = ImageIO.read(markImgFile);  
  38.   
  39.             }  
  40.             int imgWidth = img.getWidth(null);  
  41.             int imgHeight = img.getHeight(null);  
  42.             BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);  
  43.             mark(bufImg, img, mark, width, height, x, y);  
  44.             FileOutputStream outImgStream = new FileOutputStream(outputImg);  
  45.             ImageIO.write(bufImg, "jpg", outImgStream);  
  46.             outImgStream.flush();  
  47.             outImgStream.close();  
  48.         } catch (IOException e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  

3、测试一下效果

文字水印的字体和颜色需要自行定义,这里我们使用宋体,14号字体,颜色选择橙色 - -!,坐标是x轴0,y轴等于字体的大小,也就是图片的左上角。

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.         Font font = new Font("宋体", Font.PLAIN, 14);  
  3.         // 原图位置, 输出图片位置, 水印文字颜色, 水印文字  
  4.         // new MarkText4J().mark("eguidMarkText2.jpg", "eguidMarkText2.jpg", "水印效果测试", font, Color.ORANGE, 0, 14);  
  5.         // 增加图片水印  
  6.         new MarkText4J().mark("eguidMarkText2.jpg""eguid.jpg""eguidMarkText3.jpg"4020014);  
  7.     }  
简直棒极了,至此我们可以随意的给图片任意位置添加任意文字或者图片水印了。

最后,额。。。导出的图片比原本图片还小是什么鬼?欢迎加入讨论群一起讨论:371249677。- -!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的开源库JCodec来实现视频添加水印。下面是一个简单的示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.jcodec.api.FrameGrab; import org.jcodec.api.JCodecException; import org.jcodec.api.awt.AWTFrameGrab; import org.jcodec.common.model.Picture; import org.jcodec.common.model.Rational; import org.jcodec.common.model.Size; import org.jcodec.scale.AWTUtil; import org.jcodec.scale.RgbToBgr; public class VideoWatermark { public static void main(String[] args) throws IOException, JCodecException { // 原视频文件的路径 File videoFile = new File("path/to/video.mp4"); // 水印图片的路径 File watermarkFile = new File("path/to/watermark.png"); // 输出视频文件的路径 File outputFile = new File("path/to/output.mp4"); // 从原视频文件中获取率和分辨率 FrameGrab grab = new AWTFrameGrab(videoFile); Rational fps = grab.getFrameRate(); Size size = grab.getSize(); // 创建输出视频文件 VideoEncoder encoder = new MP4Encoder(fps); SeekableByteChannel output = NIOUtils.writableFileChannel(outputFile); encoder.addVideoTrack(output, size); // 读取水印图片 BufferedImage watermark = ImageIO.read(watermarkFile); // 逐处理视频 for (int frameNumber = 0; ; frameNumber++) { // 从原视频文件中获取当前图像 Picture picture = grab.getNativeFrame(); if (picture == null) { break; } // 将图像从RGB格式转换为BGR格式 Picture bgr = new Picture(size.getWidth(), size.getHeight(), ColorSpace.BGR); new RgbToBgr().transform(picture, bgr); // 将BGR格式图像转换为Java的BufferedImage BufferedImage image = AWTUtil.toBufferedImage(bgr); Graphics2D g = image.createGraphics(); // 在图像添加水印 g.drawImage(watermark, 0, 0, null); // 将Java的BufferedImage转换为BGR格式图像 Picture outputPicture = AWTUtil.fromBufferedImage(image, ColorSpace.BGR); // 将处理后的写入输出视频文件 encoder.encodeFrame(outputPicture, output); } // 完成视频编码 encoder.finishEncoding(); output.close(); } } ``` 上述代码中用到了JCodec库来读取和编码视频,以及将BGR格式图像转换为Java的BufferedImage。需要注意的是,由于JCodec库的限制,输出视频文件的编码格式必须为MP4。如果需要其他格式的视频文件,可以使用FFmpeg进行转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值