当前位置: 首页 > ai >正文

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

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() {@Overridepublic 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!
http://www.xdnf.cn/news/13369.html

相关文章:

  • el-table-v2修改表头、单元格、表格整体的宽度、高度样式
  • Web 架构之微服务拆分原则与反模式
  • 网页组件强制设置右对齐
  • 基于拓扑的信任评级实现的车载异常检测框架
  • 从零实现一个红队智能体
  • linux内核编译问题记录
  • 润乾报表display value expression使用介绍
  • Redis GEO 52 位整数的经纬分布
  • 【基于阿里云上Ubantu(x86-64)系统部署配置K8s】
  • Docker环境安装Kafka、Flink、ClickHouse镜像
  • 海外打车代驾app评价系统框架搭建
  • 获取RadioButton的text,更换textview的text
  • C++笔记-C++11(二)
  • 【Unity优化】提高热更新和打包速度
  • Centos与RockLinux设置静态ip
  • 数据库管理与高可用-PostgreSQL日常维护
  • MongoDB入门指南:环境安装与基本操作
  • QGIS新手教程4:相交、缓冲区与合并操作详解(含实战案例)
  • 多头与空头:市场博弈的两面
  • 【2025最新】Adobe Illustrator下载保姆级安装教程(附官方下载链接)
  • ThinkPad 交换 Ctrl 键和 Fn 键
  • Uncaught (in promise) TypeError: Cannot read properties of null (reading ‘xxx’)
  • RK3588开发笔记-GNSS-RTK模块调试
  • YOLO-World 部署踩坑记录
  • Linux611 libvirtb ;FTP vsftpd.conf部分配置文件
  • React 元素的生命周期
  • 从硬件视角审视Web3安全:CertiK CTO主持Proof of Talk圆桌论坛
  • GO 入门小项目-博客-结合Gin Gorm
  • 【面板数据】中国与世界各国农产品进出口贸易数据(2015-2024年)
  • 国内外数据要素标准有何不同?