python图片动态特效_python实现图片的抖音效果
(本篇文章来自小编博客
本篇文章将说一下如何使用python将普通图片处理成抖音效果,甚至制作gif动图。
1. 基本原理
Sketch练习稿之绘制抖音音符 中讲述了抖音效果的原理,领域内可能有人称这种效果为红蓝溢出效果。按照前面文章中的描述,这里以一张图片为例简单再讲一下原理。
一张正常的位图,一般 jpg 图片颜色方案为 RGB,而 png图片除了 RGB色彩通道还有 A通道控制透明,不过色彩配置还是一致的,以手上的图片 glasses.jpg 为例。
去掉 GB 两通道的图片如下:
去掉 R 通道的图片如下:
如果之间将两张图以相加的方式进行混合,就会得到原图,即第一张正常的图片。如果去掉 R 通道的图片在去掉 GB 通道的图片上方,并且向上和向左错开10px,就会得到抖音效果的图片:
2. 实现图片抖音效果
使用python3为图片添加抖音效果
2.1 库安装
需要用到两个库,一个是 pillow 用来读写图片数据,另一个是 numpy 用来处理图片数据转换成的的矩阵数据,使用 pip3 安装即可:
pip3 install pillow
pip3 install numpy
安装完成后,执行 pip3 list 会列出安装的包,检查是否完成安装。
2.2 库的操作
2.2.1 pillow
本文主要用到库中的 Image 模块。
from PIL import Image
使用 Image 模块的 open 方法可以打开图片得到图片原生数据,类型为 PIL.JpegImagePlugin.JpegImageFile:
image_data = Image.open('picname.jpg')
上述对象有两个常用的方法:show() : 显示图片,比如image_data.show()
save(path): 按照指定路径保存图片,比如image_data.save(path)
2.2.2 numpy
这里主要使用numpy 库的矩阵操作,可以很方便的对矩阵进行切片操作,与 matlab 中的操作极其类似,首先导入库:
import numpy as np
np.array() 方法可以将上面 PIL.JpegImagePlugin.JpegImageFile 对象转换为原始矩阵数据,生成的矩阵为三维矩阵,前两维度为高宽像素点坐标,第三维度为 RGB 三通道,需要注意的是转换得到的矩阵数据类型为 numpy.uint8:
img_array = np.array(image_data)
上面的操作可以逆向进行,也就是将 img_array 转换为 PIL.JpegImagePlugin.JpegImageFile 对象,需要依赖于 Image 的另一个方法 fromarray(array)
image = Image.fromarray(img_array)
可以很方便地使用切片操作处理图片矩阵数据中三个通道的数据,比如将 R 通道的数据设置为0:
img_array[:, :, 0] = 0
另外还需要用到矩阵复制的方法 numpy.copy(array),会得到 array 的复制对象:
img_other = np.copy(img_array)
2.3 具体实现导入两个库
import numpy as np
from PIL import Image打开指定图片,这里以 glasses.jpg 为例,转换得到图片矩阵数据:
img_data = Image.open('glasses.jpg')
img_array = np.array(img_data)复制得到两个新的矩阵:
img_r = np.copy(img_array)
img_bg = np.copy(img_array)这里需要注意的是,为了保证得到数据保存后的图片还是原图片的尺寸,这里只对有错位相加部分的像素点进行去通道操作,这里计划将 img_gb 向上向左错位10px,那么只需处理 img_gb 宽和高纬度上第 11px 到最后的像素点的 R 通道数据为0,同时 img_r 宽和高纬度上从第0到倒数第11个像素点的 GB 通道数据为0:
# 去GB两通道数据
img_r[:-10, :-10, 1:3] = 0
# 去除R通道数据
img_gb[10:, 10:, 0] = 0将两个矩阵数据错位相加保存到 img_array 中,即 img_r 的 [:-10,:-10,:] 数据与 img_gb 的 [10:, 10:, :]数据相加,赋值给 img_array 的 [:-10, :10, :]:
img_array[:-10, :-10, :] = img_r[:-10, :-10, :] + img_gb[10:, 10:, :]从矩阵数据创建 PIL.JpegImagePlugin.JpegImageFile 对象,并保存和显示图片:
image = Image.fromarray(img_array)
image.save('glasses_douyin.jpg')
image.show()
最终得到图片如下:
3. 创建gif动图
上面我们实现了普通图片添加抖音效果,那么想不想看一下错位不同大小的抖音效果的变化呢?可以创建不同错位下的静态抖音效果图,然后用静态图创建gif动图,废话不多说,行动!
3.1 库安装
这里创建gif动图,使用到 imageio 库,同样可以使用 pip3 安装:
pip3 install imageio
使用 imageio 模块的 mimsave() 方法生成 gif 动图,比较简单,利用方法封装得到 create_gif 函数:
def create_gif(image_list, gif_name):
'''创建gif图片:param image_list: 图片名称列表:type image_list: list:param gif_name: gif图片路径:type gif_name: unicode字符串'''
print(f'\nCreating 「{gif_name}」from {image_list} ...')
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
imageio.mimsave(gif_name, frames, 'GIF', duration = 0.05)
print(f'Saved {gif_name}!')
3.2 封装抖音效果添加函数
为了更方便得到不同错位尺寸下的静态抖音效果图,这里封装上面的实现,得到以下函数接口:
def convert_douyin_image(pic_path, offset=10):
'''为普通图片添加红蓝溢出位移效果,抖音app效果:param pic_path: 图片路径:type pic_path: unicode字符串:param offset: 红蓝位移大小,单位像素,默认值是10:return r_pic_path: 返回转换图片的路径:rtype: unicode字符串'''
if os.path.exists(pic_path):
pic_name, extension = os.path.splitext(pic_path)
pic_path_new = pic_name + '_' + str(offset) + extension
img_data = Image.open(pic_path)
img_array = np.array(img_data)
if offset > 0:
img_r = np.copy(img_array)
img_gb = np.copy(img_array)
img_r[:-offset, :-offset, 1:3] = 0
img_gb[offset:, offset:, 0] = 0
img_array[:-offset, :-offset, :] = img_r[:-offset, :-offset, :] + img_gb[offset:, offset:, :]
image = Image.fromarray(img_array)
image.save(pic_path_new)
print(f'Saved {pic_path_new}!')
return pic_path_new
接口中,对 offset 为 0 时做了处理,直接保存原图,最终函数返回保存的图片路径,方便生成图片路径列表用于生成gif。
3.3 整体实现
导入必要库:
import os
import imageio
import numpy as np
from PIL import Image
这里定义一个图片路径,方便指定待处理图片:
PIC_PATH = 'glasses.jpg'
最后,先得到错位[0, 2, 4, 6, 8, 10]px 的静态抖音效果图和图片路径列表,为了是动图连贯,处理列表中元素按照错位尺寸为 [0, 2, 4, 6, 8, 10, 8, 6, 4, 2, 0]px,然后根据 PIC_PATH 得到 gif图片保存路径,调用 create_gif 函数生成gif:
if __name__ == '__main__':
pic_list = []
for i in range(0, 11, 2):
pic_path = convert_douyin_image(PIC_PATH, i)
if pic_path:
pic_list.append(pic_path)
temp_l = list.copy(pic_list)
temp_l.reverse()
pic_list = pic_list + temp_l[1:]
p_name, p_ext = os.path.splitext(PIC_PATH)
gif_name = PIC_PATH.replace(p_ext, '.gif')
create_gif(pic_list, gif_name)
最终得到的gif图片效果如下:
完整源码参考:
4. 参考
python图片动态特效_python实现图片的抖音效果相关推荐
- python给图片加动态特效_用Python给图片加上抖音效果
前一篇 Python实现抖音体 给文字加上抖音效果,这一篇我们来用Python给图片加上抖音效果.原理其实是类似的,这里我们详细地讲解一下过程,并且给出代码实现. 准备工作 程序用到Pillow,nu ...
- python绘制动态模拟图-Python 模拟动态产生字母验证码图片功能
模拟动态产生字母验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image ...
- OpenCV图片动态特效显示(三)-- 平移显示及拉伸显示效果
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2927字,预计阅读8分钟 前言 前两篇的特效已经实现了展开.渐显及马赛克的实现,今天来实现图像的平移效果及通过显示窗体的函数改 ...
- python图像灰度化_python实现图片二值化及灰度处理方式
python实现图片二值化及灰度处理方式 我就废话不多说了,直接上代码吧! 集成环境:win10 pycharm #!/usr/bin/env python3.5.2 # -*- coding: ut ...
- python实现自动上传图片_python 实现图片自动上传七牛返回地址
python 实现图片自动上传七牛返回地址 使用markdown编写文件,图片插入一直不太方便,有些markdown编辑器实现的图片插入并且自动上传的功能,但是大多要收费,免费的又存在各种限制,不能自 ...
- python处理pdf实例_Python程序图片和pdf上文字识别实例
实例一:先减少背景杂音,再做图片文字识别 为了提高识别率,先用opencv-python对扫描的图片做预处理(减少背景杂音),然后调用pytesseract识别图片上的文字.处理方式就是: 学习Pyt ...
- python获取图片像素点颜色_Python获取图片位置像素色值及判断色值是否存在
本文背景: 公司项目的广告系统有个功能,给图片模板打指定的颜色值点,根据需要拼合的图片数量,打点数量也不同.设计说他弄好了,运营上传打点后的模板图片时,获取不到打点的位置坐标.于是找研发看是怎么回事, ...
- python读取多张图片_python读取图片的几种方式及图像宽和高的存储顺序
python读取图片的几种方式及图像宽和高的存储顺序 1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8 import cv2 import ...
- python从图片提取文字_Python从图片提取文字
需求:读取图片内的文字,图片包含url形式的和image形式的 实现思路:python调用腾讯api,参考腾讯官方文档:https://cloud.tencent.com/document/produ ...
最新文章
- Ubuntu 系统下终端界面在打开一个终端的快捷键
- ERROR Streaming result set com.mysql.jdbc.RowDataDynamic@1d5a7f6 is still active. No statements may
- 机器学习(二十三)——Beam Search, NLP机器翻译常用评价度量, 模型驱动 vs 数据驱动
- [缓存]迅雷下载原理
- SQL内连接、外连接、全连接、交叉连接、自连接、自然连接
- 手动启动_电站首台机组首次手动开机启动一次性成功
- python连接sql sever_R和python连接SQL sever 数据库操作
- 用微信公众号做淘宝优惠券查券搜券和返利机器人的详细配置教程
- 深度 DeepinXP-Lite V5.9
- Golang 并发之锁
- matlab [c, lags]=xcorr(y1,y2) 转python
- 拒酒词,好难找哟,留到有用
- Win11电脑名如何更改?Win11更改电脑名的方法
- 量化干货 | 机器学习能否助力风险投资?
- 实现QQ登陆(QQ互联)
- 1135 Is It A Red-Black Tree (30分)
- point-wise element-wise
- CC110L 与CC1101的区别
- python 两个冒号是什么成语_python查询双押词
- 单体内置对象_js基础-单体内置对象(Global、Math)