AIGC方案-java实现视频伪动效果

Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作

支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。

学习可参考:https://dunwu.github.io/pages/adacc5/

一、1.1旋转效果(适合作切图动效)

方案:该效果我认为可以放在图片的前2秒实现切换动效,具体实现方案:在切换到下一张图的2秒内(120帧)要转360度,所以需要每一帧让图片转3度。

特殊点:如果该图片对应的音频时长小于2秒,这种情况应该不转动

核心代码:

java 复制代码
Thumbnails.of("/Users/luzelong/Downloads/images/prompt_1.png").size(370,370).rotate(45).toFile("/Users/luzelong/Desktop/f.png");
Thumbnails.of("/Users/luzelong/Downloads/images/prompt_1.png").size(370,370).rotate(70).toFile("/Users/luzelong/Desktop/g.png");

控制rotate里面的值从0 -> 360即可实现旋转一周

ps:图1是原图,图2是旋转45度,图3是旋转70度

二、水平移动(可配合方法四)

实现方案:

1.将图片放大两倍

2.将原大小的截取框 在放大后的图片上 从左移动到右边

参考代码:

java 复制代码
Thumbnails.of("/Users/luzelong/Downloads/images/prompt_1.png").scale(2d).toFile("/Users/luzelong/Desktop/c.png");
Thumbnails.of("/Users/luzelong/Desktop/c.png").sourceRegion(Positions.CENTER_LEFT, 370, 370).size(370,370).keepAspectRatio(false)
        .toFile("/Users/luzelong/Desktop/d.png");
Thumbnails.of("/Users/luzelong/Desktop/c.png").sourceRegion(Positions.CENTER_RIGHT, 370, 370).size(370,370).keepAspectRatio(false)
        .toFile("/Users/luzelong/Desktop/e.png");

缺点:先放大再从中心左侧开始截取可能会丢失重要的图片细节,优化点是减少放大倍数

ps:图1为原图,图2为图片放大后截取的中心左侧,图3为图片放大后截取的中心右侧。

三、中心渐进放大(可配合方法四)

实现方案:截取图片的某一区间,将这个区间等比例拉伸到原图大小.

核心代码实现:

java 复制代码
Thumbnails.of("/Users/luzelong/Downloads/images/prompt_1.png").sourceRegion(Positions.CENTER, 250, 250).size(370, 370).keepAspectRatio(false)
.toFile("/Users/luzelong/Desktop/a.png");

其中size里面填写原图的大小,针对每一帧的图片不断减小sourceRegion里面的值(起始值是原图大小)即可实现缩放效果。

ps:第一张图是原图,第二张图sourceRegion里设置的大小是300,第三张图sourceRegion里设置的大小是250,该动效可能只适合1:1的图片,因为其他比例的图片按照比例截取会出现小数的像素点,而真实的像素是不存在小数的,就会导致放大过程抖动!

四、通过水印法,将图片放在另一张图片中心

java 复制代码
Thumbnails.of("/Users/luzelong/Downloads/images/2.png").sourceRegion(Positions.CENTER, 480, 268).size(480,268)
        .toFile("/Users/luzelong/Downloads/projects/works/aigc-maliang/c.png");
//添加水印
Thumbnails.of("/Users/luzelong/Downloads/images/1.png").size(960,536).watermark(Positions.CENTER, ImageIO.read(new File("/Users/luzelong/Downloads/projects/works/aigc-maliang/c.png")), 1f)
        .outputQuality(0.8f).toFile("/Users/luzelong/Downloads/projects/works/aigc-maliang/d.png");

经过于是可以通过下面这段代码实现,将放大虚化后的图片作为原图的背景

java 复制代码
public static BufferedImage centerOutsideBlurBackground(BufferedImage bufferedImage){
    try {
        BufferedImage newImage = Thumbnails.of(bufferedImage).scale(1.2d).asBufferedImage();
        // 添加模糊滤镜
        float[] matrix = new float[121];
        for (int i = 0; i < matrix.length; i++) {
            matrix[i] = 1.0f / matrix.length;
        }
        Kernel kernel = new Kernel(11, 11, matrix);

        ImageFilter filter = new ImageFilter() {
            @Override
            public BufferedImage apply(BufferedImage img) {
                ConvolveOp op = new ConvolveOp(kernel);
                return op.filter(img, null);
            }
        };
        //添加水印
        return Thumbnails.of(newImage).size(newImage.getWidth(), newImage.getHeight()).addFilter(filter).watermark(Positions.CENTER, bufferedImage, 1f)
                .outputQuality(1f).asBufferedImage();
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

五、ffempeg实现的视频动效

sh 复制代码
//渐入(视频前90帧)
i in.mp4 -vf fade=in:0:90 out.mp4
//黑白
i in.mp4 -vf lutyuv="u=128:v=128" out.mp4
//锐化
i in.mp4 -vf unsharp=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5 out.mp4
//反锐化
i in.mp4 -vf unsharp=7:7:-2:7:7:-2 out.mp4
//渐晕
i in.mp4 -vf vignette=PI/4 out.mp4
//闪烁渐晕
i in.mp4 -vf vignette='PI/4+random(1)PI/50':eval=frame out.mp4
//视频颤抖
i in.mp4 -vf crop="in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)sin(n/10):(in_h-out_h)/2+((in_h-out_h)/2)sin(n/7)" out.mp4
//色彩变幻
i in.mp4 -vf hue="H=2PIt:s=sin(2PIt)+1" out.mp4
//模糊处理
i in.mp4 -vf boxblur=5:1:cr=0:ar=0 out.mp4
//镜像翻转
i in.mp4 -vf crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left]pad=iw2[a];[a][right]overlay=w out.mp4
//水平翻转
i in.mp4 -vf geq=p(W-X\,Y) out.mp4
//垂直翻转
i in.mp4 -vf vflip out.mp4
//浮雕效果
i in.mp4 -vf format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2' out.mp4
//均匀噪声
i in.mp4 -vf noise=alls=20:allf=t+u out.mp4

失败报错,部分命令不支持:

sh 复制代码
2023/05/09 15:01:54.119 main [INFO] FfmeegUtil (FfmeegUtil.java:93) Failed to inject frame into filter network: Invalid argument
2023/05/09 15:01:54.119 main [INFO] FfmeegUtil (FfmeegUtil.java:93) Error while processing the decoded data for stream #0:0
2023/05/09 15:01:54.119 main [INFO] FfmeegUtil (FfmeegUtil.java:93) [aac @ 0x7fc38280a800] Qavg: 64267.547
2023/05/09 15:01:54.119 main [INFO] FfmeegUtil (FfmeegUtil.java:93) [aac @ 0x7fc38280a800] 2 frames left in the queue on closing
2023/05/09 15:01:54.129 main [INFO] FfmeegUtil (FfmeegUtil.java:93) Conversion failed!
相关推荐
别动哪条鱼6 分钟前
MP4转AAC转换器C++
c++·ffmpeg·音视频·aac
帧栈9 分钟前
开发避坑指南(72):HttpHeaders 的add()方法和set()方法有什么区别?
java·spring·http
unclecss23 分钟前
把 Spring Boot 的启动时间从 3 秒打到 30 毫秒,内存砍掉 80%,让 Java 在 Serverless 时代横着走
java·jvm·spring boot·serverless·graalvm
tuokuac28 分钟前
@PathVariable与@RequestParam
java·spring
q***160835 分钟前
Tomcat的server.xml配置详解
xml·java·tomcat
程序员西西35 分钟前
SpringBoot整合Apache Spark实现一个简单的数据分析功能
java·后端
n***840736 分钟前
Tomcat 乱码问题彻底解决
java·tomcat
LiLiYuan.39 分钟前
【Lombok库常用注解】
java·开发语言·python
培风图南以星河揽胜1 小时前
Java实习模拟面试|离散数学|概率论|金融英语|数据库实战|职业规划|期末冲刺|今日本科计科要闻速递:技术分享与学习指南
java·面试·概率论
能鈺CMS1 小时前
能鈺CMS · 虚拟发货源码
java·大数据·数据库