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!
相关推荐
hqxstudying14 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·22 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
redreamSo26 分钟前
AI Daily | AI日报:ChatGPT识破10年顽疾,医疗AI震撼登场; 微信支付MCP开放,机遇与风险并存; 蒙娜丽莎图让大模型几乎全军覆没
程序员·aigc·资讯
Bug退退退1231 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.2 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥2 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人2 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试