ISEE小语
一天不联系,一周不联系,一个月不联系,不知不觉中,我们都成了过去。
Python的强大且灵活,在日常工作中表现得游刃有余,它在数据处理、图像处理和媒体文件生成方面有着广泛的应用。本文将介绍如何使用Python将文字转换为PNG图片,再将图片合成为GIF动态图,最后生成MP4视频,实现全程转换。
挺有意思的,有兴趣的同学可以试试看!
环境:
Pycharm
Python 3.9.16
安装:
pip install 以下三方库
imageio==2.34.1
pillow==10.3.0
实现功能:
主要包括三大块:
一、将文字转换为PNG图片
二、将PNG图片合成为GIF动态图
三、将GIF动态图转换为MP4视频
文字转换为PNG图片
我们需要将文字转换为PNG图片,这可以通过Pillow库来实现。
有一点需要注意,在实现过程中使用的中文,会有乱码问题,所以需要提前下载一个字体,小栈使用的是simhei.ttf。
这个字体可随便,只要有即可,小栈使用的后面也会分享出来。
from PIL import Image, ImageDraw, ImageFont
import textwrap
def create_image(text, width=400, height=200, font_size=20, font_path='SimHei.ttf', text_color='black',
bg_color='white', output_path='output.png'):
# 创建空白图像
image = Image.new('RGB', (width, height), color=bg_color)
draw = ImageDraw.Draw(image)
# 使用特定字体
font = ImageFont.truetype(font_path, font_size)
# 自动换行
wrapped_text = textwrap.fill(text, width=30) # 30 是每行的字符数
# 计算文本的边界框
text_bbox = draw.textbbox((0, 0), wrapped_text, font=font)
# 计算文本位置(居中)
x = (width - (text_bbox[2] - text_bbox[0])) / 2 # 右侧 - 左侧
y = (height - (text_bbox[3] - text_bbox[1])) / 2 # 下侧 - 上侧
# 在图像上绘制文本
draw.text((x, y), wrapped_text, font=font, fill=text_color)
# 保存图片
image.save(output_path)
# 使用示例
font_size = 70
colors = [
{'text_color': 'purple', 'bg_color': 'lightyellow', 'text_': '文字……'},
{'text_color': 'black', 'bg_color': 'white', 'text_': '生成'},
{'text_color': 'magenta', 'bg_color': 'lightblue', 'text_': 'PNG图片'},
{'text_color': 'black', 'bg_color': 'white', 'text_': '再生成'},
{'text_color': 'green', 'bg_color': 'lightcoral', 'text_': 'GIF动态图'},
{'text_color': 'black', 'bg_color': 'white', 'text_': '最后生成'},
{'text_color': 'black', 'bg_color': 'beige', 'text_': 'MP4视频!'}
]
for index, color in enumerate(colors):
bg_color = color.get('bg_color')
text_color = color.get('text_color')
text_ = color.get('text_')
create_image(text_, width=1080, height=1920, font_size=font_size, text_color=text_color,
bg_color=bg_color, output_path=f'../pngs/{index}.png')
(左右滑动查看完整代码)
结果:
PNG图片合成为GIF动态图
png图片合成为GIF动态图这部分需要分成两个阶段:
第一:加载文字生成的图片
第二:创建GIF动态图
首先,加载文字生成的图片,因为创建GIF动态图需要的是图片的对象,所以独立出来,方便使用。
import os
from PIL import Image
# 加载图片
def load_images(folder_path):
images = []
for filename in os.listdir(folder_path):
if filename.endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')): # 支持的文件格式
img_path = os.path.join(folder_path, filename)
img = Image.open(img_path) # 打开图片文件
images.append(img) # 添加到列表中
return images
folder_path = '../pngs'
images = load_images(folder_path)
print(images)
(左右滑动查看完整代码)
结果:
[<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFE90A4C0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFE90AEE0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFF0E04C0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFF0F04C0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFF0F0430>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFF0F0EB0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1080x1920 at 0x2AAFF0F0F10>]
(左右滑动查看完整代码)
然后,创建GIF动态图
# 创建 GIF 动态图
def create_gif(images, output_path='output.gif', duration=500):
# 保存为 GIF 动态图
images[0].save(output_path, save_all=True, append_images=images[1:], duration=duration, loop=0)
# 使用示例
create_gif(images, output_path='images.gif', duration=1000)
(左右滑动查看完整代码)
最后,我们看到一下结果:
GIF动态图转换为MP4视频
我们将生成的GIF动态图转换为MP4视频。
# -*- coding: utf-8 -*-
import imageio
# 读取GIF文件
gif_file = '../png_to_gif/images.gif'
with imageio.get_reader(gif_file, 'GIF') as reader:
# 提取GIF中的帧
frames = [frame for frame in reader]
# 设置MP4的输出路径
mp4_file = 'images.mp4'
# 设置希望的MP4时长(秒)
desired_length = 6
# 计算需要的fps
num_frames = len(frames)
fps = num_frames / desired_length
# 保存为MP4格式
imageio.mimsave(mp4_file, frames, fps=fps)
(左右滑动查看完整代码)
结果:
总结
通过以上步骤,我们成功地将文字转换为PNG图片,之后将这些图片合成为GIF动态图,最后将GIF转换为MP4视频。这个过程展示了Python在处理多媒体文件方面的强大能力。
Python的Pillow、imageio库为我们提供了便捷的图像和视频处理功能,使我们能够轻松实现从文字到视频的全程转换。希望这篇文章对你有所帮助!
本次分享只限于实现功能,其无美观和装饰,并且可能也会有些小BUG,但不影响功能,有兴趣的同学可拓展!
源码已经整理,有需要可下载!
点个“赞”和“在看”,是对小栈最大的支持!
后台回复“to_mp4”即可获取源码!
文章就分享到这儿,喜欢就点个赞吧!