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

发布于:2025-06-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
学习可参考:https://dunwu.github.io/pages/adacc5/

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

方案:该效果我认为可以放在图片的前2秒实现切换动效,具体实现方案:在切换到下一张图的2秒内(120帧)要转360度,所以需要每一帧让图片转3度。
特殊点:如果该图片对应的音频时长小于2秒,这种情况应该不转动
核心代码:

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.将原大小的截取框 在放大后的图片上 从左移动到右边
参考代码:

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为图片放大后截取的中心右侧。

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

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

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的图片,因为其他比例的图片按照比例截取会出现小数的像素点,而真实的像素是不存在小数的,就会导致放大过程抖动!

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

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");

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

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实现的视频动效

//渐入(视频前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

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

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!