前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java操作FFmpeg处理图片

java操作FFmpeg处理图片

作者头像
JQ实验室
发布2022-02-14 20:56:58
7680
发布2022-02-14 20:56:58
举报
文章被收录于专栏:实用技术实用技术
代码语言:javascript
复制
图片加水印:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageAddWatermarkUtil {
    public static void imageAddWatermark(String srcFileUrl) {

        File srcFolder = new File(srcFileUrl);
        // int i = 0;
        for (File file : srcFolder.listFiles()) {
            // File srcImgFile = new File(srcFileUrl);//得到文件

            if (file.isFile() && file.getName().endsWith(".jpg")) {
                Image srcImg = null;
                try {
                    srcImg = ImageIO.read(file);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } // 文件转化为图片
                int srcImgWidth = srcImg.getWidth(null);// 获取图片的宽
                int srcImgHeight = srcImg.getHeight(null);// 获取图片的高

                // 加水印
                Font font = new Font("微软雅黑", Font.PLAIN, 10);
                BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics2d = bufImg.createGraphics();
                graphics2d.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
                graphics2d.setColor(Color.WHITE); // 设置水印颜色
                graphics2d.setFont(font); // 设置字体
                // 设置水印的坐标
                String name = file.getName();
                String waterMarkContent = name.substring(0, name.indexOf("."));
                // System.out.println(getWatermarkLength(waterMarkContent, graphics2d));
                int x = srcImgWidth - getWatermarkLength(waterMarkContent, graphics2d) - 3;
                int y = srcImgHeight - 3;
                graphics2d.drawString(waterMarkContent, x, y); // 画出水印
                graphics2d.dispose();
                // 输出图片
                FileOutputStream outImgStream = null;
                try {
                    outImgStream = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    ImageIO.write(bufImg, "jpg", outImgStream);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    outImgStream.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    outImgStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }

    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    public static void main(String[] args) {
        
    }
}
代码语言:javascript
复制
图片合并:

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class ImageMergeUtil {
    
    public static String mergeImage(String srcFileUrl, String size)  {        
//        BufferedImage image1 = ImageIO.read(file1);  
//        BufferedImage image2 = ImageIO.read(file2);  
//        String srcFileUrl = "D:\\cdv\\screenshot-test\\image-folder";
        int counts = getFileCounts(srcFileUrl);
        String sizeString[] = size.split("x");
        int width = Integer.valueOf(sizeString[0]);
        int height = Integer.valueOf(sizeString[1]);
        int totalHeight = 0;
        if (counts%5==0) totalHeight = height*counts/5;
        else totalHeight = height*counts/5 + 1;
        BufferedImage combined = new BufferedImage(width*5,totalHeight, BufferedImage.TYPE_INT_RGB);  
        
        // paint both images, preserving the alpha channels  
        Graphics2D graphics2d = combined.createGraphics();  
        
        File srcFolder = new File(srcFileUrl);
        int i = 0;
        for (File file : srcFolder.listFiles()) {
            
            if (file.isFile()&&file.getName().endsWith(".jpg")) {
                BufferedImage fileImage = null;
                try {
                    fileImage = ImageIO.read(file);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                graphics2d.drawImage(fileImage, width*(i%5), height*(i/5), null);
                //删除已经加入照片文件
                file.delete();
                i++;
            }
        }
  
        // Save as new image  
        File photoWallFolder = new File( srcFileUrl + "\\photoWall");// fisrcFileUrl + "\\photoWall";
       if (!photoWallFolder.exists()) {
        photoWallFolder.mkdirs();
    }
        File photoWallImage = new File(srcFileUrl + "\\photoWall", "photoWall.jpg");
        int k = 0;
        while(photoWallImage.exists()) {
            photoWallImage = new File(srcFileUrl + "\\photoWall", "photoWall-" + String.valueOf(k++) + ".jpg");
        }
        try {
            ImageIO.write(combined, "JPG", photoWallImage);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return photoWallImage.getAbsolutePath();
    }  

    public static int  getFileCounts(String srcFileUrl) {
        int counts = 0;
        File fileList[] = new File(srcFileUrl).listFiles();
        for (int i = 0; i < fileList.length; i++) {
            if (fileList[i].isFile()&&fileList[i].getName().endsWith(".jpg")) {
                counts++;
            }
        }
        //System.out.println(counts);
        return counts;
        
    }
    public static void main(String[] args) {
        String srcFileUrl = "";
        mergeImage(srcFileUrl, "200x120");
    }

}

图片抽帧:

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ScreenShotUtil {
    // private static Logger logger = LoggerFactory.getLogger(ScreenShotUtil.class);
    private static final Logger logger = LoggerFactory.getLogger(ScreenShotController.class);

    public static PointScreen shotByTimePoint(String screenshotEXEPath, String srcFileUrl, String timePoint,
            String size, String outUrl) {

        List<String> cmd = new LinkedList<String>();
        cmd.add(screenshotEXEPath);
        // cmd.add("-y");
        cmd.add("-i");
        cmd.add(srcFileUrl);
        cmd.add("-ss");
        cmd.add(timePoint);
        // cmd.add("-i");
        // cmd.add(srcFileUrl);
        cmd.add("-t");
        cmd.add("0.001");
        cmd.add("-s");
        cmd.add(size);
        cmd.add("-ignore-black");
        cmd.add(outUrl + "\\temp\\.jpg");
        // logger.debug("shotByTimePoint: " + cmd);
        // System.out.println(cmd);
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(cmd);
        File imageFolder = new File(outUrl + "\\temp");
        imageFolder.mkdirs();

        try {
            Process process = pb.start();
            process.waitFor();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        File newImageFile = null;
        for (File imageFile : imageFolder.listFiles()) {
            String imageName = timePoint.replaceAll("[:|.]", "-");
            newImageFile = new File(outUrl, imageName + ".jpg");
            imageFile.renameTo(newImageFile);
            imageFile.delete();
        }
        return new PointScreen(newImageFile.getAbsolutePath(), timePoint);
    }

    public static List<PointScreen> shotByKeyFrame(String screenshotEXEPath, String srcFileUrl, String size,
            String outUrl) {
        /**
         * 转场分析抽取若干张图片(输出名称包含百纳秒) snapshot -i oceans-clip.webm -scene_transition 1
         * oceans-clip-%013d.jpg 输出例为 oceans-clip-0000000000123.jpg,
         * oceans-clip-0000000004567.jpg, oceans-clip-0000000089000.jpg
         */
        List<String> cmd = new LinkedList<String>();
        List<PointScreen> pointScreens = new ArrayList<>();
        try {
            cmd.add(screenshotEXEPath);
            cmd.add("-i");
            cmd.add(srcFileUrl);
            cmd.add("-scene_transition");
            cmd.add("1");
            cmd.add("-s");
            cmd.add(size);
            cmd.add("-ignore-black");
            cmd.add(outUrl + "\\temp\\-%013d.jpg");

            ProcessBuilder pb = new ProcessBuilder();
            pb.command(cmd);
            File tempFolder = new File(outUrl + "\\temp");
            tempFolder.mkdirs();

            // 开始抽帧
            Process process = pb.start();
            process.waitFor();

            File newImageFile = null;
            if (tempFolder.listFiles() != null) {
                for (File imageFile : tempFolder.listFiles()) {
                    String imageNameWithSuffix = imageFile.getName();
                    String timePoint = NanosecondsToTimeUtil
                            .nanosecondsToTime(imageNameWithSuffix.substring(1, imageNameWithSuffix.indexOf(".")));
                    String imageName = timePoint.replaceAll("[:|.]", "-");
                    newImageFile = new File(outUrl, imageName + ".jpg");
                    // System.out.println(newImageFile);
                    imageFile.renameTo(newImageFile);
                    imageFile.delete();
                    pointScreens.add(new PointScreen(newImageFile.getAbsolutePath(), timePoint));
                }
            }
        } catch (Exception e) {
            logger.info("抽取关键帧报错: " + e.getMessage(), e);
        }
        return pointScreens;

    }

    public static String photoWall(String screenshotEXEPath, String srcFileUrl, String size, String outFileUrl) {
        shotByKeyFrame(screenshotEXEPath, srcFileUrl, size, outFileUrl);
        ImageAddWatermarkUtil.imageAddWatermark(outFileUrl);
        // ImageMergeUtil.mergeImage(outFileUrl, size);
        return ImageMergeUtil.mergeImage(outFileUrl, size);
    }

    public static void main(String[] args) {
        
        // System.out.println(shotByTimePoint(exePath,srcFileUrl,"00:00:00.000",size,outFileUrl));//0时间点截图测试
        // shotByKeyFrame(srcFileUrl, size, outFileUrl);//0关键帧截图测试

        // 1.定时截图测试 时间间隔 intervalTime 秒
        // long intervalTime = 10;
        // long videoLength = VideoDuration.getVideoDuration(srcFileUrl);
        // List<PointScreen> pointScreens = new ArrayList<>();
        // for (long i = 0; i <= videoLength; i = i + intervalTime) {
        // timePoint =
        // NanosecondsToTimeUtil.nanosecondsToTime(Long.toString(i*1000*10000));
        // pointScreens.add(ScreenShotUtil.shotByTimePoint(srcFileUrl, timePoint, size,
        // outFileUrl));
        // }
        // for (Iterator<PointScreen> iterator = pointScreens.iterator();
        // iterator.hasNext();) {
        // System.out.println(iterator.next());
        // }

        // 2.定点截图
        // List<String> extraParam = new ArrayList<>();
        // extraParam.add("00:01:01.000");
        // extraParam.add("00:02:02.000");
        // extraParam.add("00:03:03.000");
        // extraParam.add("00:14:04.000");
        // for (Iterator<String> iterator = extraParam.iterator(); iterator.hasNext();)
        // ScreenShotUtil.shotByTimePoint(srcFileUrl, iterator.next(), size,
        // outFileUrl);
        // 3.定量截图

        // long videoDuration = VideoDuration.getVideoDuration(srcFileUrl);
        // int intervalTime = (int)(videoDuration/(10-1));
        // for (long i = 0; i <= videoDuration; i = i + intervalTime) {
        // String timePoint1 =
        // NanosecondsToTimeUtil.nanosecondsToTime(Long.toString(i*1000*10000));
        // ScreenShotUtil.shotByTimePoint(srcFileUrl, timePoint1, size, outFileUrl);
        // }

        // 4.照片墙
        // System.out.println(photoWall(srcFileUrl, size, outFileUrl));

    }
}
代码语言:javascript
复制
获取视频时间长度:

import java.io.File;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.MultimediaInfo;

public class VideoDuration {

    public static long getVideoDuration(String srcFileUrl) {
        
        File source = new File(srcFileUrl);
        Encoder encoder = new Encoder();
        MultimediaInfo mediaInfo = null;
        try {
            mediaInfo = encoder.getInfo(source);
        } catch (EncoderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long duration = mediaInfo.getDuration();
        return duration/1000;
        
    }
    public static void main(String[] args) {
        
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档