舔狗日记:学姐生日快到了,使用Python把她的照片做成视频当礼物

Posted 轻松学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了舔狗日记:学姐生日快到了,使用Python把她的照片做成视频当礼物相关的知识,希望对你有一定的参考价值。

舔狗日记1

前言

这不是学姐生日快到了,于是我学了一手使用Python来把学姐的照片生成为视频,到时候给她一个惊喜!


好了先不舔了,下面分享一下用python代码实现多张图片合成MP4视频为实例,做下详细代码讲解。

一、需要调入的模块

1、imageio模块

Python模块imageio是一个用于读取和写入图像及视频数据的库。它支持多种格式,并且可以使用NumPy数组进行操作。

以下是一些关键的函数:

  • imageio.imread():从文件中读取图像数据并返回一个NumPy数组。
  • imageio.imwrite():将一个NumPy数组写入到文件。
  • imageio.mimsave():将多个图像帧组成的列表保存为动画文件(例如GIF)。
  • imageio.get_reader():获取一个对象,该对象用于逐帧读取给定文件中的动画图像。
  • imageio.get_writer():获取一个对象,该对象用于逐帧写入动画图像到指定文件中。

使用这些函数,可以方便地读取、写入和处理各种图像及视频数据格式。

2、Image 模块

PIL 是 Python 中常用的图像处理库,Image 模块是其中的一个重要模块,它提供了各种图像操作和处理的函数。

以下是 Image 模块中一些主要函数及其作用:

  • open(): 打开并返回指定文件路径的图像对象。
  • fromarray(): 将 numpy 数组或 PIL 图像对象转换为 PIL 图像对象。
  • new(): 创建一个新的指定大小、模式和颜色的空白图像对象。
  • save(): 将图像保存为指定格式的文件。
  • resize(): 修改图像的大小。
  • crop(): 裁剪图像的指定区域。
  • rotate(): 旋转图像指定角度。
  • show(): 显示图像。

除此之外,还有很多其他常用的函数,例如调整亮度和对比度、应用滤镜等等。这些函数可以帮助我们实现各种复杂的图像处理任务,并且通常也会有一些参数可用于进一步调节函数的行为,具体使用时可以参考相关文档。

二、实现合并多张图片转成 mp4 视频

使用 Python 中的画图库 PIL(Python Imaging Library)或者 OpenCV 读取每一张图片。

使用第三方库 imageio 将多张图片合并成一个视频文件。

配置生成视频文件的视频帧数、视频尺寸和视频播放速度等参数。

以下是一个简单的示例代码:

import os
import imageio
from PIL import Image

# 设置生成的视频文件名和路径
filename = 'output.mp4'
filepath = os.path.join(os.getcwd(), filename)

# 读取所有 PNG 图片
images = []
for file_name in sorted(os.listdir()):
    if file_name.endswith('.png'):
        images.append(Image.open(file_name))

# 将图片转换为视频
fps = 30  # 每秒钟30帧
with imageio.get_writer(filepath, fps=fps) as video:
    for image in images:
        frame = image.convert('RGB')
        video.append_data(frame)

实现原理,读取所有需要合并的图片文件,将它们存储到一个列表中。然后使用 imageio 库的 get_writer() 函数创建一个视频写入器对象,并设置视频的播放速度(fps)。之后在循环过程中,读取列表中的每一张图片,在将其转换为带有 RGB 颜色模式的格式后添加到视频帧中。最终输出一个合并了所有目标图片的视频文件。

三、优化改进一下

将程序并行化进行处理,加快处理多张图片的速度。注:以下方法可能并非最优方法

import os
import concurrent.futures
import imageio
from PIL import Image

# 设置生成的视频文件名和路径
filename = "output.mp4"
filepath = os.path.join(os.getcwd(), filename)


def process_image(file_name):
    if file_name.endswith(".png"):
        image = Image.open(file_name)
    return image.convert("RGB")


with concurrent.futures.ThreadPoolExecutor() as executor:
    # 寻找所有 png 文件
    image_files = [file for file in os.listdir() if file.endswith(".png")]

    # 利用线程池并行处理图像
    images = list(executor.map(process_image, image_files))


# 将图片转换为视频文件
fps = 30  # 每秒钟30帧
with imageio.get_writer(filepath, fps=fps) as video:
    for image in images:
        video.append_data(image)

这里使用 concurrent.futures 库中的 ThreadPoolExecutor 对象进行并行处理。首先在主线程中寻找读取当前工作目录下的所有需要合并的 PNG 图片,创建任务列表。然后将任务提交给线程池中并保证能够快速、异步地处理目标文件。在处理完所有 PNG 图片之后,将其存储到一个 images 中的列表中并最后转换成视频。

对于刚学习Python或者正在学习Python的小伙伴,我准备了2023最新的Python学习资料,直接在文章最后的名片自取哦!包括学习遇到的问题,都可以问的。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了python代码实现图片转成视频的使用,而imageio中提供了大量能使我们快速便捷地处理数据的函数和方法。

注意,由于 GIL 的存在,Python 的多线程并不总能带来真正的性能提升。如果性能是关键,请考虑使用更优秀的 Python 解释器、使用类似 joblib 的库以及使用其他语言编写多线程实现。

好了,不说了,我要继续当舔狗去了~~~

Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

1、引言

小屌丝:鱼哥,新年快乐~ ~
小鱼:新年快乐,小屌丝,虽然是元旦,但是也算是迈入新的一年了,也该有新的形象了。
小屌丝:鱼哥,你说的没错啊,新的一年,我要用新的姿势去追妹子。
小鱼:… 怎么三句不说妹子,你无话可说了??
小屌丝:妹子是我提升技术的动力!
小鱼:… 好吧,只要你能提升技能,其他的都无所谓…
小屌丝:呦吼~~ 对了鱼哥,我记得你有一篇博文,把文字写在图片里
小鱼:对哦,不少小伙伴通过这个方式,让自己的女友感动了。
小屌丝:那能不能把图片写在别的地方呢?
小鱼:例如呢??
小屌丝:excel,word,PDF 等等…
小鱼:…唉我去~~
小屌丝:嘿嘿~ ~ 来嘛 ~ ~

2、代码实战

2.1 思路

我们今天要分享的,是把图片写入到excel中,

注意:
这里说的,不是截取一张图片,粘贴到excel;
而是通过像素写入到excel中。

我们来捋一下思路:

  • 准备源图片,目标excel;
  • 通过Pillow 来读图片的取像素(RGB);
  • 通过openpyxl 向excel cell内填充十六进制色值;
  • 最后把转换的RGB像素直接写入到excel中;

说到这里,就们就来分步实现。

2.2 文件准备

需要写入而Excel的源图片:

2.3 实战

2.3.1 安装

本次需要用到两个模块: Pillow 和 openpyxl 。
老规矩, pip 方式安装:

pip install Pillow 
pip install openpyxl 

其他方式安装:

Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
Python3:我低调的只用一行代码,就导入Python所有库!!

2.3.2 代码实战

1、色值转换
由于 图片读取的像素是RGB值,而excel是十六进制写入,
所以需要定义一个RGB与十六进制转换的函数

# -*- coding:utf-8 -*-
# @Time   : 2022-01-03
# @Author : carl_DJ

'''
定义RGB 和十六进制色值转换函数
'''

def rgb_to_hex(rgb):
    rgb = rgb.split(',')
    color = ''
    #循环遍历
    for i in rgb:
        num = int(i)
        color  += str(hex(num))[-2:].replace('x','0').upper()
    return  color

2、图片转换
此操作是逐行读取图片的 RGB 色值,再将 RGB 色值转换为十六进制色值填充到 Excel 的 cell 中。

# -*- coding:utf-8 -*-
# @Time   : 2022-01-03
# @Author : carl_DJ


'''
逐行读取图片中的RGB色值,再将RGB色值转换十六进制,填充到excel中
'''

def img_to_excel(img_path,excel_path):
    #读取源图片
    img_src = Image.open(img_path)
    #设置图片宽高
    img_width = img_src.size[0]
    img_hight = img_src.size[1]

    #图片加载
    str_strlist = img_src.load()
    #获取当前的excel文件
    wb = openpyxl.Workbook()
    #保存文件
    wb.save(excel_path)
    #打开excel_path 下的excel文件,并写入信息
    wb = openpyxl.load_workbook(excel_path)
    cell_width,cell_height = 1.0,1.0

    #设置excel的写入页
    sheet = wb['Sheet']

    #循环图片的高与宽,并存入
    for w in range(img_width):
        for h in range(img_hight):
            data = str_strlist[w,h]
            color = str(data).replace("(","").replace(")","")
            color  = rgb_to_hex(color)

            #设置填充颜色为color
            fille = PatternFill("solid",fgColor = color)
            sheet.cell(h + 1,w + 1).fill = fille

    #循环遍历row,让其全部写入
    for i in range(1,sheet.max_row + 1):
        sheet.row_dimensions[i].height = cell_height
    #循环遍历column,让其全部写入
    for i in range(1,sheet.max_column + 1):
        sheet.column_dimensions[get_column_letter(i)].width = cell_width

    #保存文件
    wb.save(excel_path)
    #关闭
    img_src.close()

3、代码整合

# -*- coding:utf-8 -*-
# @Time   : 2022-01-03
# @Author : carl_DJ

import  openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils import  get_column_letter
from PIL import Image,ImageFont,ImageDraw,ImageColor


'''
色值转换:
从图片读取的像素块色值是 RGB 值,
RGB 和十六进制色值转换。
'''

def rgb_to_hex(rgb):
    rgb = rgb.split(',')
    color = ''
    #循环遍历
    for i in rgb:
        num = int(i)
        color  += str(hex(num))[-2:].replace('x','0').upper()
    return  color


'''
图片转换:
逐行读取图片中的RGB色值,再将RGB色值转换十六进制,填充到excel中
'''

def img_to_excel(img_path,excel_path):
    #读取源图片
    img_src = Image.open(img_path)
    #设置图片宽高
    img_width = img_src.size[0]
    img_hight = img_src.size[1]

    #图片加载
    str_strlist = img_src.load()
    #获取当前的excel文件
    wb = openpyxl.Workbook()
    #保存文件
    wb.save(excel_path)
    #打开excel_path 下的excel文件,并写入信息
    wb = openpyxl.load_workbook(excel_path)
    cell_width,cell_height = 1.0,1.0

    #设置excel的写入页
    sheet = wb['Sheet']

    #循环图片的高与宽,并存入
    for w in range(img_width):
        for h in range(img_hight):
            data = str_strlist[w,h]
            color = str(data).replace("(","").replace(")","")
            color  = rgb_to_hex(color)

            #设置填充颜色为color
            fille = PatternFill("solid",fgColor = color)
            sheet.cell(h + 1,w + 1).fill = fille

    #循环遍历row,让其全部写入
    for i in range(1,sheet.max_row + 1):
        sheet.row_dimensions[i].height = cell_height
    #循环遍历column,让其全部写入
    for i in range(1,sheet.max_column + 1):
        sheet.column_dimensions[get_column_letter(i)].width = cell_width

    #保存文件
    wb.save(excel_path)
    #关闭
    img_src.close()


if __name__ == '__main__':
    #源图片地址
    img_path = './queue.jgp'
    #保存excel地址
    excel_path = './queue.xlsx'
    #执行
    img_to_excel(img_path, excel_path)

4、运行结果

3、总结

写到这里,今天的分享就差不多结束了。
因为今天也用到了Pillow,如果想快速入手,可以参照小鱼的这篇博文《Python3,10行代码,我把情书写在她的照片里,她被我的才华征服了。

这里小鱼提醒一下,
如果你的源图片很大,运行完成后,打开Excel会提示文件损坏,
因为Excel的行数有限,导致无法全部写完数据。

Excel报错详情

xml报错详情:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error254800_05.xml</logFileName><summary>在文件“D:\\Project\\img\\king.xlsx”中检测到错误</summary><removedParts><removedPart>已删除的部件: 部件 /xl/styles.xml。 (样式)</removedPart></removedParts><repairedRecords><repairedRecord>已修复的记录: /xl/worksheets/sheet1.xml 部分的 单元格信息</repairedRecord></repairedRecords></recoveryLog>

以上是关于舔狗日记:学姐生日快到了,使用Python把她的照片做成视频当礼物的主要内容,如果未能解决你的问题,请参考以下文章

七夕到了,男同学们也该用Python做点什么啦!!!

开学季喜欢上了一个学妹,用python把她的照片做成了拼图游戏,她看了...

Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

面向切面编程AOP基于Spring的AOP的配置和使用(注解方式)

舔狗至高境界,学会这个技巧让你从舔狗升华到海王Python趣味爬虫

舔狗至高境界,学会这个技巧让你从舔狗升华到海王Python趣味爬虫