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

用python生成GIF动图—用于博客插图或封面等

生成GIF动图🚀

由于目前自己是在做大模型,还有一些树莓派硬件之类的东西,一是大模型的流式输出的例子需要用到GIF,二是做单片机的时候例如一些灯的闪烁和变化需要用到,所以之前也是一直有这个打算所以就记录一下这个生成GIF的这个过程,我自己是先用录屏软件先把视频录好,然后再用python程序将视频转换成GIF图的这样一个过程。


文章目录

  • 生成GIF动图🚀
  • 1.录屏工具OBS(我自己用的其他的也行)
    • 1.1 下载OBS
    • 1.2 安装OBS
    • 1.3 配置OBS(基础设置/输出路径/输出格式等)
      • 1.3.1 首次安装初始化设置
      • 1.3.2 视频输出格式设置
      • 1.3.3 更改录制视频的保存路径
      • 1.3.4 设置视频源(录哪个软件或显示器的视频)
      • 1.3.5 设置开始录制和结束录制的快捷键
    • 1.4 录制视频
  • 2.使用python将MP4文件转换为GIF动图
    • 2.1 基础转换代码
    • 2.2 压缩转换代码
  • 结束

1.录屏工具OBS(我自己用的其他的也行)


OBS (Open Broadcaster Software) 是一个免费且开源的视频录制和直播软件。它广泛应用于游戏直播、网络研讨会、教育培训等场景,支持多平台操作系统(如Windows、macOS和Linux)。OBS具有强大的功能,包括实时视频和音频捕获、场景切换、视频编码、以及与流媒体平台的无缝集成。其高度可定制的用户界面和插件支持,使用户能够根据需求调整设置,满足各种复杂的录制和直播需求。

1.1 下载OBS

我自己的话是比较喜欢使用OBS进行录屏的,而且视频的清晰度质量上也有一定的保证,当然如果有其他录屏软件也是可以的,不管是QQ的快捷键录屏,还是腾讯会议的是录屏其实都是可以用的,然后这里我自己是Windows所以就点了windows,点完之后就自动下载了。
在这里插入图片描述
电玩Download之后就会自动下载然后进入到这个页面(我自己是用谷歌浏览器下载的)。
在这里插入图片描述
然后双击下载的安装包就可以了。

1.2 安装OBS

在这里插入图片描述
然后安装的时候也没什么特殊的到这里愿意换个安装路径就换个安装路径就行。
在这里插入图片描述
然后点Install等待安装。
在这里插入图片描述
然后出现这个界面就算安装完成了。
在这里插入图片描述

1.3 配置OBS(基础设置/输出路径/输出格式等)

1.3.1 首次安装初始化设置

在这里插入图片描述
然后下一步选择基础画布的分辨率和帧率,因为我自己的是4K 144HZ的屏幕所以直接就给拉满了,之后也方便我自己录制一些教程。
在这里插入图片描述
然后点下一步就行,之后还会跳出一个测试完成的界面,直接点击取消就可以。
之后进入到这个页面就是
在这里插入图片描述

1.3.2 视频输出格式设置

OBS默认的录制获得的格式是Matroska模式(.mkv)格式,是一个可以存储多种数据的很优秀的格式,但是为了之后在程序中,或者我们自己打开查看视频的时候,不会出现格式原因打不开的情况,所以这里我们把输出的格式转换成MP4格式。点击右下角的设置。
在这里插入图片描述
然后左侧菜单栏选择输出,然后再输出菜单栏的录像菜单栏里选择录像格式。
在这里插入图片描述
在这里插入图片描述
选择MP4格式,简简单单才是真!
在这里插入图片描述
设置完成之后提示如果要录制多个音轨还是要用MKV格式,我们一个音轨都不录,我们只录视频我们什么都不怕!
在这里插入图片描述

1.3.3 更改录制视频的保存路径

因为我们后续可能要录很多素材,而OBS录制视频的保存路径是C盘下用户下的的Video路径,而且我还要录制4K的视频为了防止之后C盘爆满,所以要对这个路径进行一下修改。
在这里插入图片描述
首先在D盘下新建一个OBSvedio文件夹,当然这里位置和文件夹名字都可以自己选。
在这里插入图片描述
在设置的左侧菜单栏的输出选项卡内找到录像中的录像路径设置,然后顺手把录像路径设置下面的生成没有空格的文件名的对号给打上,避免之后生成视频名字里面用于python程度读取的时候有非法字符。
在这里插入图片描述
找到录像路径,然后给生成没有空格的文件名打上对号之后,点击录像路径后面的浏览。
在这里插入图片描述
然后找到D盘下之前新建的OBSvideo文件夹,点开文件夹。
在这里插入图片描述
里面是空白的,然后点击右下角的选择文件夹。
在这里插入图片描述
然后录像路径就设置完成了,然后点击应用。
在这里插入图片描述
应用按键变按被锁定之后再点击确定即可退出设置回到主页面。
在这里插入图片描述

1.3.4 设置视频源(录哪个软件或显示器的视频)

之后需要设置我们录制的视频的源头,也是录制哪个应用或者哪个显示器的视频。
点击来源中的加号。
在这里插入图片描述
然后点击显示器采集
在这里插入图片描述
然后点击确认就行。
在这里插入图片描述
再然后在这里选择你要录制的显示器之后点击确定
在这里插入图片描述

1.3.5 设置开始录制和结束录制的快捷键

为啥要设置快捷键,因为如果不设置的话就需要在软件中点击开始录制,会把软件录上,即使是可以通过设置将软件隐藏掉,则开始录制之后也会需要先把软件给关掉自己才能看见想录的内容。
设置快捷键就在设置的快捷键部分,然后分别选中开始录制和结束录制,选中之后按下你想使用的快捷键即可,我这里开始录制设置Ctrl+NUM 1(Ctrl 加小键盘的数字1不然我发现其他快捷键好多都冲突)。然后点击应用,点击确定就行了,之后将OBS缩在后台的时候就可以直接点击按键开始录制和结束录制了。
在这里插入图片描述

1.4 录制视频

全部配置好之后后点击右上角的最小化缩到底部菜单栏。
在这里插入图片描述
之后可以将界面打开到准备开始录制的页面,准备开始录制的时候安装快捷键开始录制ctrl+NUM 1 (Ctrl 加小键盘的数字1),开始录制之后屏幕下放的OBS图标会出现一个红点。
在这里插入图片描述
然后再按快捷键ctrl+NUM 1 (Ctrl 加小键盘的数字1)结束录制的时候,红点会消失。

在这里插入图片描述
之后就会在1.3.3中设置的视频保存文件夹下生成一个格式为mp4的视频文件。
在这里插入图片描述

2.使用python将MP4文件转换为GIF动图


在得到了录制的视频MP4文件之后,可以直接用python的moviepy库,将MP4的视频转成gif,输入下面的命令安装moviepy库,然后新建项目,选解释器这个就不说了,不会的同学找一下周围会的同学帮助一下。

pip install moviepy

将视频转换成GIF的基础代码如下,之后这个库还可以进行裁减抽帧等一系列操作,我们先直接转换成GIF。

2.1 基础转换代码

from moviepy.editor import VideoFileClip# 加载MP4视频文件 视频路径换成自己的
clip = VideoFileClip("视频文件.mp4")# 将视频转换为GIF并保存
clip.write_gif("output.gif")

运行之后出现如下进度条。
在这里插入图片描述
再之后出现使用imageio构建output.gif的图片的提示,这个过程时间略长,我转了一个5秒的视频,用了差不多50s。
在这里插入图片描述
进入到项目路径文件夹下查看差不多两2500KM多一点,但GIF图像如果过大的话CSDN是不允许插入的,但是要插到博客里需要给降到1500KB以下基本就可以,不然会提示插入失败。
在这里插入图片描述
一般双击图片就可以双击查看动图了,我这边的动图查看默认使用WPS打开了,然后Pycharm默认是不能打开GIF文件的,所以智能从外部查看,之前也稍微找了有没有Pycharm查看GIF的插件,没找到比较好的。
这里的GIF图片是一个跑深度学习例子代码的一个动图。
在这里插入图片描述

2.2 压缩转换代码

为了压缩GIF的大小我们主要使用两招,裁剪视频和降低帧率,虽然还有缩小视频尺寸,但是变糊的话显然是最不希望看到的情况。
裁剪视频就是在使用VideoFileClip读取视频的时候调用subclip方法,降低帧率就是在保存的时候使用一个fps参数,我记得我们录制的视频在默认开始的时候我调成了60fps,所以下面的代码设置成15之后,会缩小生成的GIF文件的大小。

from moviepy.editor import VideoFileClip# 裁剪视频
clip = VideoFileClip("2024-08-19_16-02-11.mp4").subclip(3, 6)# 降低帧数并保存
clip.write_gif("output.gif", fps=15)  # 设置帧率为15帧每秒

在这里插入图片描述

结束

转换的代码很简单,基本流程就是录屏加转换,而且GIF还可以设置成博客的封面,转成GIF没啥难度,就自己录个屏就行了。

相关文章:

用python生成GIF动图—用于博客插图或封面等

生成GIF动图🚀 由于目前自己是在做大模型,还有一些树莓派硬件之类的东西,一是大模型的流式输出的例子需要用到GIF,二是做单片机的时候例如一些灯的闪烁和变化需要用到,所以之前也是一直有这个打算所以就记录一下这个生…...

[RCTF2019]draw

下载是一个文本文档,百度AI cs pu lt 90 fd 500 rt 90 pd fd 100 rt 90 repeat 18[fd 5 rt 10] lt 135 fd 50 lt 135 pu bk 100 pd setcolor pick [ red orange yellow green blue violet ] repeat 18[fd 5 rt 10] rt 90 fd 60 rt 90 bk 30 rt 90 fd 60 pu lt 90 f…...

设计模式 - 责任链模式

💝💝💝首先,欢迎各位来到我的博客!本文深入理解设计模式原理、应用技巧、强调实战操作,提供代码示例和解决方案,适合有一定编程基础并希望提升设计能力的开发者,帮助读者快速掌握并灵活运用设计模式。 💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定…...

jpg怎么转换成pdf?6个简单方法,实现jpg转换成pdf

你是否也曾想将jpg图片转换为pdf格式文档呢?亦或者在处理文档或制作报告时,不知道怎么才能更快地将多张图片整合成一个pdf文件呢?如果你正在寻找简单快速的方法,又有哪些工具可以帮助您完成图片转pdf呢?别着急&#xf…...

ptrade排坑笔记——使用量化交易的时候有报错提示!

前言 今天要和大家分享一个遇见的问题,有客户反馈,自己在使用量化交易的时候,会有报错!会在后文分享我们是如何解决这个问腿的! 一、问题描述 客户主要遇见的问题是,量化在进行交易的过程中,…...

C#-MemoryMarshal

MemoryMarshal 类是 .NET 中用于处理内存的工具类,它提供了一组静态方法,用于在托管代码中以安全和高效的方式操作内存块。MemoryMarshal 类主要用于处理原始内存数据而不需要进行复制,这对于性能关键的操作非常有用。 MemoryMarshal 类包含…...

Java并发编程的艺术

Java作为一门面向对象的编程语言,自1995年推出以来,一直以其稳定性、跨平台性和丰富的API受到广大开发者的喜爱。在Java的发展历程中,并发编程一直是其重要的特性之一。本文将探讨Java并发编程的艺术,解析其核心概念和常用并发工具…...

华为 OLT 添加 ONU 配置 (SNMP管理模式)

上网业务数据规划 OLT PON口 0/8/0 ONU_ID 0 ONU 序列号 4857544323BE233B 外层 VLAN ID 2012 内层VLAN ID 35 用户 FE 端口 ONU 0/1/1 用户VLAN 35 DBA带宽类型 Type 2 流量模板编号 10 DBA 模板编号 30 ONU线路模板编号 40 T-CONT (网管) 0 T-CONT(业务_ 2 GEM (网管) 0 …...

【JavaScript】[]和{} 的转换

背景 ([])? true:false ({})? true:false ([] true)? true:false ({} true)? true:false ([] true)? true:false ({} true)? true:false分析 [ ]和{ } 都是复杂类型,以上都是三目运算符判断 1.判断[ ]和{ } 是否存在 声明了这些已经分配了内存&#xf…...

C#关于多线程的线程问题

using System.Text; ​ namespace 平时练习8._19day06 {internal class Program{static async Task Main(string[] args){Console.WriteLine(Thread.CurrentThread.ManagedThreadId );StringBuilder sb new StringBuilder();for (int i 0; i < 10000; i){sb.Append("…...

eclipse打开失败 java was started but returned exit code=13

报错详细信息如下 原因&#xff1a;eclipse版本和jdk版本不一致。系统之前jdk是1.6&#xff0c;然后安装1.8之后默认修改了环境变量。导致eclipse启动失败 解决方案&#xff1a;修改eclipse目录下的eclipse.ini文件增加一下内容。文档说明&#xff1a;eclipse.ini - Eclipsepe…...

【计算机网络】应用层自定义协议与序列化

记得在上一节我们说过TCP中的读取时需要改进&#xff0c;这节就可以解决读取问题了。 目录 应用层再谈 "协议"网络版计算机方案一方案二 序列化 和 反序列化 重新理解 read、write、recv、send 和 tcp 为什么支持全双工 应用层 再谈 “协议” 我们在UDP与TCP中写的…...

企业级无线局域网(WLAN)架构:高效部署策略与技术指南

前言&#xff1a;无线网络直接影响整体网络性能&#xff0c;在当今企业网环境中&#xff0c;已有超过一半的数据流量通过无线信道传输&#xff0c;随着物联网技术的普及&#xff0c;无线网将承载更多的关键业务流量。企业/园区场景的无线网络值得考虑的关键因素有很多&#xff…...

【Python-办公自动化】1秒筛选12个月指定逻辑数值

欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介绍: 我热衷于将复杂的技术概念以简单易懂…...

Linux:进程替换

什么是进程替换&#xff1f; 我们的可执行程序&#xff0c;在运行起来的时候就上一个进程 一个进程就会有他的内核数据结构代码和数据 把一个已经成型的进程的代码和数据替换掉&#xff0c;这就叫进程替换 也就是可以通过系统调用把当前进程替换位我们需要的进程 那么替换…...

带你认识:数据仓库宽表~~~浅显易懂

1. 构建宽表的目的 讲宽表我想从为什么需要宽表入手&#xff0c;而不是一上来就抠概念。因为我觉得一门知识叫什么名字并不是最核心的&#xff0c;关键是搞清楚它的诞生背景以及如何在特定场景用好它。 构建宽表的目的很简单,就是为了"一站式"尽可能多的展示我们需要…...

记录|MessageBox.Show()的使用

目录 前言一、解析1.1 代码1.2 具体图片解析 更新时间 前言 遇到了其他人写的MessageBox.Show()的用法&#xff0c;有点懵&#xff0c;特此记录。 一、解析 1.1 代码 MessageBox.Show("登录失败!", "用户登录", MessageBoxButtons.OK, MessageBoxIcon.E…...

LabVIEW软件定制开发公司的前景如何?

LabVIEW软件定制开发公司的前景在当前的技术发展环境下展现出一定的潜力与挑战。这一领域的市场前景主要受到工业自动化、物联网、智能制造等技术趋势的推动&#xff0c;同时也受到行业竞争、技术更新以及人才市场的制约。 ​ 市场需求与增长潜力 随着工业4.0、物联网和智能制…...

vue3列表页搜索条件封装

搜索框组件 封装常用搜索框组件&#xff0c;类型有&#xff1a; input&#xff08;默认值)selectselectV2 (value/label键值对数组)datePickeryear 集成新增、修改、删除、导入、导出按钮&#xff0c;支持slot自定义其他按钮封装搜索、重置按钮封装按钮权限封装导入弹框 本例仅…...

十三、切片的复制

1、使用函数copy 注意点&#xff1a;复制前必须再声明一个与要复制对象类型相同的切片 var cheeses make([]int, 5)cheeses[0] 1cheeses[1] 2cheeses[2] 3cheeses[3] 4cheeses[4] 5var myCheeses make([]int, 5)copy(myCheeses, cheeses) 使用copy函数将cheeses的数据…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...