java添加水印

生成水印图片

  1. 获取背景透明的水印图片
BufferedImage image = new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);
// 获取Graphics2D
Graphics2D g2d = image.createGraphics();

// ----------  增加下面的代码使得背景透明  -----------------
image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = image.createGraphics();
// ----------  背景透明代码结束  -----------------
//生成透明背景失败,!!! jpg模型没有透明通道 请使用png

  1. 直接在图片上添加图片水印
   public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) {  
        Graphics2D g = bufImg.createGraphics();  
        g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);  
         /* 
该方法出现问题 这里的image是pdf处理的图片对象,java没有看到直接处理的方法。
  com.itextpdf.text.Image image = Image.getInstance(filename); 
image.setAbsolutePosition(50, 400);//坐标  
            image.setRotation(-20);//旋转 弧度  
            image.setRotationDegrees(-45);//旋转 角度  
            image.scaleAbsolute(200,100);//自定义大小  
            image.scalePercent(50);//依照比例缩放  
*/
        g.drawImage(markImg, x, y, width, height, null);  
        g.dispose();  
    }  
  1. 直接在文字上添加水印
    public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {  
        Graphics2D g = bufImg.createGraphics();  
        g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);  
        g.setColor(color);  
        g.setFont(font);  
        g.drawString(text, x, y);  
        g.dispose();  
    }  

pdf打水印

用上面生成的图像 直接打到对应的pdf文件中即可
1.水印的方向 大小等通过对Image的调整即可实现
2.水印的位置通过addImage复写方法中的6个参数即可决定

package com.trs.wsg.pdf.itext;

import java.io.FileOutputStream;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class PdfAddWaterMark {

    public PdfAddWaterMark() {
        // TODO Auto-generated constructor stub
    }

    /**
     * 
     * 【功能描述:添加图片和文字水印】 【功能详细描述:功能详细描述】
     * @param srcFile 待加水印文件
     * @param destFile 加水印后存放地址
     * @param text 加水印的文本内容
     * @param textWidth 文字横坐标
     * @param textHeight 文字纵坐标
     * @throws Exception
     */
    public void addWaterMark(String srcFile, String destFile, String text,
            int textWidth, int textHeight) throws Exception
    {
        // 待加水印的文件
        PdfReader reader = new PdfReader(srcFile);
        // 加完水印的文件
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
                destFile));
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        // 设置字体
       // BaseFont font = BaseFont.createFont();
        BaseFont basefont = BaseFont.createFont("c:/windows/fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        //设置透明度
        PdfGState gs = new PdfGState(); 
        gs.setFillOpacity(1f); 
        gs.setStrokeOpacity(1f);
        // 循环对每页插入水印
        for (int i = 1; i < total; i++)
        {
            // 水印的起始
            content = stamper.getUnderContent(i);
            // 开始
            content.beginText();
            // 设置颜色 默认为蓝色
            content.setColorFill(BaseColor.GRAY);
            // content.setColorFill(Color.GRAY);
            // 设置字体及字号
            content.setFontAndSize(basefont, 38);
            // 设置起始位置
            // content.setTextMatrix(400, 880);
            content.setTextMatrix(textWidth, textHeight);
            // 开始写入水印
            content.showTextAligned(Element.ALIGN_LEFT, text, textWidth,
                    textHeight, 45);
            content.endText();

            //t添加图片水印
            Image img2 = Image.getInstance("D:\\s.png");  
            img2.setRotationDegrees(45);
           /* image.setAbsolutePosition(50, 400);//坐标  
            image.setRotation(-20);//旋转 弧度  
            image.setRotationDegrees(-45);//旋转 角度  
            image.scaleAbsolute(200,100);//自定义大小  
            image.scalePercent(50);//依照比例缩放  
*/            img2.setAbsolutePosition(0, 0);  
            content.addImage(img2);
        }
        stamper.close();
    }
}

视频打水印

通过ffmepmg程序,调用系统方法实现。

package com.trs.wsg.video.ffmpeg;
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 {
    /**
     * 判断返回内容通过正则表达式判断
     * @param str
     * @return
     */
      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);
      }
      /**
       * @ HashMap<String,String> dto 参数传递对象<br>
       * dto中包含的参数<br>
       * (必填)1.ffmpeg_path:ffmpeg执行文件地址,如 d:\\ffmpeg\\ffmpeg.exe Linux下直接调用ffmpeg命令(当然你事先已经有这个程序了)<br>
       * (必填)2.input_path:原视频路径<br>
       * (必填)3.video_converted_path:转换后视频输出路径<br>
       * (可选)4.screen_size:视频尺寸 长度乘宽度 乘号用英文小写"x"如 512x480<br>
       * (可选)5.logo:水印地址(其实在ffmpeg中有一个专门的watermark参数,logo跟它有何不同,我还没看,不过对我来说效果一样 貌似需要png图片才行)<br>
       * (可选,如果填写必须有logo才行,默认为0)6.xaxis:水印logo的横坐标(只有logo参数为一个正确路径才行) 比如0<br>
       * (可选,如果填写必须有logo才行,默认为0)6.yaxis:水印logo的纵坐标(只有logo参数为一个正确路径才行) 比如0<br>
       * (可选)vb:视频比特率,传入一个数值,单位在程序里面拼接了k
       * (可选)ab:音频比特率,传入一个数值,单位在程序里面拼接了k
       */
       public String videoTransfer(HashMap<String, String> dto){  
//         String ffmpeg_path,String input_path,String video_converted_path,String logo,String screen_size,String xaxis,String yaxis,String vb,String ab
           List<String> cmd = new ArrayList<String>();  
           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")) {//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";
//              /tmp/TVLOG.png   //linux下logo或者水印路径
//              d:\\:/ffmpeg/Logo.png  //Windows的logo或者水印路径
                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");//这个是视频质量4就比较高了貌似是最高的,6低,具体几到几我忘了……
            cmd.add(dto.get("video_converted_path"));  
            String converted_time= CmdExecuter.exec(cmd);  
            return returnSecond(converted_time);//获取转换时间
       }  
       public static void  main(String [] arg){
           HashMap<String, String>dto=new HashMap<String, String>();
           dto.put("ffmpeg_path", "C:\\Users\\Administrator\\Downloads\\java-ffmpeg\\ffmpeg\\ffmpeg.exe");//必填
           dto.put("input_path", "C:\\Users\\Administrator\\Downloads\\java-ffmpeg\\ffmpeg\\input\\test.mp4");//必填
           dto.put("video_converted_path", "C:\\Users\\Administrator\\Downloads\\java-ffmpeg\\ffmpeg\\output\\output.mp4");//必填
           dto.put("logo", "D\\\\:/s.png");//可选(注意windows下面的logo地址前面要写4个反斜杠,如果用浏览器里面调用servlet并传参只用两个,如 d:\\:/ffmpeg/input/logo.png)
           String secondsString=  new FFMPEG().videoTransfer(dto);
           System.out.println("转换共用:"+secondsString+"秒");
       }
}
package com.trs.wsg.video.ffmpeg;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
public class CmdExecuter {
    public static String exec(List<String> cmd) {
        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;
            List<String> returnStringList = new LinkedList<String>();
            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;
    }
}

最后是引用的资源

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>  
        <groupId>com.itextpdf.tool</groupId>  
        <artifactId>xmlworker</artifactId>  
        <version>5.5.10</version>  
    </dependency>
    <dependency>
          <groupId>com.itextpdf</groupId>
          <artifactId>itextpdf</artifactId>
          <version>5.5.10</version>
    </dependency> 
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.14-beta1</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.0.8</version>
    </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值