py_gif制作

news2024/9/20 18:53:13
from PIL import Image
import moviepy.editor as mp
import os

# 1. 定义函数 resize_frame,用于调整视频帧的大小
def resize_frame(frame, max_size=240):
    img = Image.fromarray(frame)
    img = img.resize((max_size, max_size), Image.Resampling.LANCZOS)  # 使用 LANCZOS 采样进行高质量缩放
    return img

# 2. 定义函数 resize_image,用于调整图片的大小
def resize_image(image_path, max_size=240):
    with Image.open(image_path) as img:
        img = img.resize((max_size, max_size), Image.Resampling.LANCZOS)  # 使用 LANCZOS 采样进行高质量缩放
        return img

# 3. 定义函数 video_to_gif,用于处理视频文件,将其转换为 GIF
def video_to_gif(video_path, max_size=240, num_frames=24):
    clip = mp.VideoFileClip(video_path)  # 加载视频文件
    duration = clip.duration  # 获取视频总时长
    timestamps = [duration * i / num_frames for i in range(num_frames)]  # 计算分割帧的时间点

    frames = []
    for t in timestamps:
        frame = clip.get_frame(t)  # 提取指定时间点的帧
        resized_frame = resize_frame(frame, max_size)  # 调整帧的大小
        frames.append(resized_frame)

    return frames

# 4. 定义函数 save_gif,用于将帧列表保存为 GIF 文件
def save_gif(frames, output_path):
    frames[0].save(output_path, save_all=True, append_images=frames[1:], format='GIF', loop=0, duration=100, optimize=True)

# 5. 定义函数 get_unique_output_path,用于生成唯一的输出文件名
def get_unique_output_path(output_path):
    base, ext = os.path.splitext(output_path)
    counter = 1
    new_output_path = output_path

    while os.path.exists(new_output_path):
        new_output_path = f"{base}_{counter}{ext}"
        counter += 1

    return new_output_path

# 6. 定义函数 convert_file,用于处理单个文件
def convert_file(file_path, output_dir, max_size=240):
    ext = os.path.splitext(file_path)[1].lower()  # 获取文件扩展名
    output_file_name = os.path.splitext(os.path.basename(file_path))[0] + '.gif'
    output_file_path = get_unique_output_path(os.path.join(output_dir, output_file_name))

    if ext in ['.jpg', '.jpeg', '.png', '.bmp']:
        img = resize_image(file_path, max_size)  # 如果是图片文件,调用 resize_image 函数
        img.save(output_file_path, format='GIF')  # 保存为 GIF 文件
    elif ext in ['.mp4', '.avi', '.mov', '.mkv']:
        frames = video_to_gif(file_path, max_size)  # 如果是视频文件,调用 video_to_gif 函数
        save_gif(frames, output_file_path)  # 保存为 GIF 文件
    else:
        print(f"Unsupported file type: {file_path}")  # 不支持的文件类型提示

# 7. 定义函数 process_directory,用于处理目录中的所有文件
def process_directory(directory_path, output_dir, max_size=240):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)  # 确保输出目录存在

    for filename in os.listdir(directory_path):
        file_path = os.path.join(directory_path, filename)
        if os.path.isfile(file_path):
            convert_file(file_path, output_dir, max_size)  # 处理单个文件

# 8. 定义函数 convert_to_gif,根据输入的路径处理单个文件或目录
def convert_to_gif(input_path, output_path, max_size=240):
    if not os.path.exists(output_path):
        os.makedirs(output_path)  # 确保输出目录存在

    if os.path.isfile(input_path):
        convert_file(input_path, output_path, max_size)  # 如果是文件,直接转换
    elif os.path.isdir(input_path):
        process_directory(input_path, output_path, max_size)  # 如果是目录,处理目录中的所有文件
    else:
        print(f"File or directory {input_path} does not exist.")  # 文件或目录不存在提示

# 9. 示例使用:
input_path = "source"  # 替换为你的图片或视频文件路径或目录路径
output_path = "output_directory"  # 输出目录
convert_to_gif(input_path, output_path, max_size=240)  # 调用转换函数

在这里插入图片描述
在这里插入图片描述
微信gif限制:大小控制1m范围

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】—— Java面向对象基础:Java中如何创建和使用三角形类(TriAngle)来计算面积

目录 第一步:定义TriAngle类 第二步:编写TriAngleTest测试类 运行程序 总结 在Java编程中,面向对象的编程思想是一种非常强大的工具,它允许我们将现实世界中的实体(如三角形)抽象成程序中的类&#xff…

c++关于字符串的练习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include<string> using namespace std;int main() {string s1;int letter0,digit0,space0,other0;cout<<"请输入一个字符串:"…

redis学习笔记 ——redis中的四大特殊数据结构

一.前言 在之前的学习中&#xff0c;我们已经介绍了Redis中常见的五种基本的数据结构&#xff0c;而今天我们就要开始介绍Redis的四种特殊的数据结构&#xff0c;它们分别是bitmap(位图)&#xff0c; HyperLogLog(基数统计),Geospatial(地理信息),Stream。 二.位图(Bitmap) …

springboot+vue+mybatis计算机毕业设计电子产品交易系统+PPT+论文+讲解+售后

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对电子产品交易管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

并发高负载场景下的负载均衡优化方案

并发高负载场景下&#xff0c;负载均衡优化技术 负载均衡是一种计算机技术&#xff0c;主要用于在多个计算机(如计算机集群)、网络连接、CPU、硬盘驱动器或其他资源中分配工作负载。 其主要目标是优化资源使用、最大化吞吐率、最小化响应时间&#xff0c;同时避免任何一个资源的…

跨境电商避坑指南:如何在亚马逊和速卖通安全进行测评补单

大家好&#xff0c;近期&#xff0c;不少从事跨境电商的朋友纷纷向我求助&#xff0c;他们在执行测评补单时频繁遭遇支付难题&#xff0c;如支付失败、支付成功后订单被取消&#xff0c;更有甚者&#xff0c;账号遭遇封禁。许多朋友误以为这仅仅是支付卡的问题&#xff0c;但实…

【生信分析常用软件】plink常用功能之翻转正负链(--flip)

官网:PLINK 1.9 plink --bfile plink --flip flip.txt --make-bed --out test 当不同数据合并时&#xff0c;如果一个数据使用正链&#xff0c;另外一个数据使用反链&#xff0c;就会导致合并数据出现问题&#xff0c;报错。 这种时候方案一&#xff1a;舍弃所有不能合并位点&…

【图像去噪】论文复现:代替ReLU!Pytorch实现即插即用激活函数模块xUnit,并插入到DnCNN中实现xDnCNN!

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

keil添加芯片包

找到.pack将其移动到KEIL的文件路径下 双击Keil.STM32F1xx_DFP.2.4.1.pack&#xff0c;点击【Next>>】&#xff0c;开始安装芯片支持包 重新打开keil5&#xff0c;打开任意的工程&#xff0c;点击工具栏的魔术棒按钮 选择Device&#xff0c;可以看到STM32F1系列芯片已经被…

AUTOSAR_EXP_ARAComAPI的3.1章节笔记

3.1 Approach 为什么AUTOSAR发明了另一种通信中间件API/技术&#xff0c;而市场上有几十种——尤其是AutoSar AP的指导方针之一是重用现有的经过验证的技术&#xff1f;在提出新的中间件设计之前&#xff0c;我们确实评估了现有的技术&#xff0c;乍一看&#xff0c;这些技术似…

判别分析分类上接贝叶斯决策,下接最小距离分类

多元正态分布下的贝叶斯决策&#xff0c;称为判别分析分类。 先验概率相等时&#xff0c;等价于最小距离分类。 最小马氏距离分类 判别分析分类 贝叶斯后验概率

米家商城主题 html 页面源码分享,可用于网页设计作业

使用技术&#xff1a; HTML, CSS , Javascript 项目亮点&#xff1a; 1. 仿照米家商城页面布局所做的页面样式结构 2. 首页放置了可自动切换的轮播图 3. 登录页有表单结构&#xff0c;并且有切换的动画效果 4. 包含实时的动态时间&#xff0c;使用 js 实现 5. 页面布局清…

2024年8月28日(docker网络)

跨主机的容器网络连接 A>mysql B>java容器 将A -p3306:3306 端口映射就可以实现 一、docker网络 1、本地网络 bridge 所有容器连接到桥就可以使用外网,使用nat让容器可以访问外网,使用ip a s指令查看桥,所有容器连接到此桥,ip地址都是172.17.0.0/16网段,桥是启动…

机器学习 之 DBSCAN算法 及实现

1.K-means 与 DBSCAN 的比较 K-means 和 DBSCAN 都是聚类算法&#xff0c;但它们之间有显著的区别&#xff1a; K-means&#xff1a; 基于中心点的方法&#xff0c;要求用户提前指定簇的数量。适用于球形簇&#xff0c;且簇大小相近。无法处理噪声数据和任意形状的簇。 DBSCAN…

Mysql基础练习题 182.编写解决方案来报告所有重复的电子邮件 (力扣)

182.编写解决方案来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL 建表插入数据&#xff1a; #建表插入数据 Create table If Not Exists Person (id int, email varchar(255)) Truncate table Person insert into Person (id, email) values (…

初识Vue.js:从零开始构建你的第一个Vue项目

初识Vue.js&#xff1a;从零开始构建你的第一个Vue项目 &#x1f680; 引言 简要介绍主题 在现代Web开发中&#xff0c;前端框架的选择至关重要。Vue.js作为一款渐进式JavaScript框架&#xff0c;以其简单易用、灵活高效的特性&#xff0c;迅速赢得了开发者的青睐。本篇文章将…

论文阅读与源码解析:CMX

论文阅读与源码解析&#xff1a;CMX: Cross-Modal Fusion for RGB-X Semantic Segmentation with Transformers 论文地址&#xff1a;https://arxiv.org/pdf/2203.04838 GitHub项目地址&#xff1a;https://github.com/huaaaliu/RGBX_Semantic_Segmentation 源码&#xff1a;h…

生产es所有节点全部掉线 排查

生产es所有节点全部掉线 查看message日志发现 内存溢出 修改jvm的改小 清理buff/cache sync && echo 1 > /proc/sys/vm/drop_caches sync && echo 2 > /proc/sys/vm/drop_caches sync && echo 3 > /proc/sys/vm/drop_caches 把es内存的…

GenAI 斜杠计划丨开启职业加速密码:图文设计专场参会体验

目录 前言 活动概览 活动开始&#xff1a;AI时代的召唤 主题分享一&#xff1a;《看到GenAI的力量&#xff1a;Amazon Bedrock功能操作》 1. 大模型的选择与理解 2. Amazon Bedrock的神奇魅力 主题分享二&#xff1a;《创意与技术的交汇&#xff1a;Zilliz向量数据库助力…

element的日期时间修改时间没有秒以及默认的时间时分修改

<el-form-item label"上架时间" required"required"><el-form:model"courseForm"ref"unmountFormRef"inlinestyle"text-align: left"label-position"left":rules"sjtimeRules"><el-form…