(本篇文章来自小编博客

本篇文章将说一下如何使用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实现图片的抖音效果相关推荐

  1. python给图片加动态特效_用Python给图片加上抖音效果

    前一篇 Python实现抖音体 给文字加上抖音效果,这一篇我们来用Python给图片加上抖音效果.原理其实是类似的,这里我们详细地讲解一下过程,并且给出代码实现. 准备工作 程序用到Pillow,nu ...

  2. python绘制动态模拟图-Python 模拟动态产生字母验证码图片功能

    模拟动态产生字母验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image ...

  3. OpenCV图片动态特效显示(三)-- 平移显示及拉伸显示效果

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2927字,预计阅读8分钟 前言 前两篇的特效已经实现了展开.渐显及马赛克的实现,今天来实现图像的平移效果及通过显示窗体的函数改 ...

  4. python图像灰度化_python实现图片二值化及灰度处理方式

    python实现图片二值化及灰度处理方式 我就废话不多说了,直接上代码吧! 集成环境:win10 pycharm #!/usr/bin/env python3.5.2 # -*- coding: ut ...

  5. python实现自动上传图片_python 实现图片自动上传七牛返回地址

    python 实现图片自动上传七牛返回地址 使用markdown编写文件,图片插入一直不太方便,有些markdown编辑器实现的图片插入并且自动上传的功能,但是大多要收费,免费的又存在各种限制,不能自 ...

  6. python处理pdf实例_Python程序图片和pdf上文字识别实例

    实例一:先减少背景杂音,再做图片文字识别 为了提高识别率,先用opencv-python对扫描的图片做预处理(减少背景杂音),然后调用pytesseract识别图片上的文字.处理方式就是: 学习Pyt ...

  7. python获取图片像素点颜色_Python获取图片位置像素色值及判断色值是否存在

    本文背景: 公司项目的广告系统有个功能,给图片模板打指定的颜色值点,根据需要拼合的图片数量,打点数量也不同.设计说他弄好了,运营上传打点后的模板图片时,获取不到打点的位置坐标.于是找研发看是怎么回事, ...

  8. python读取多张图片_python读取图片的几种方式及图像宽和高的存储顺序

    python读取图片的几种方式及图像宽和高的存储顺序 1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8 import cv2 import ...

  9. python从图片提取文字_Python从图片提取文字

    需求:读取图片内的文字,图片包含url形式的和image形式的 实现思路:python调用腾讯api,参考腾讯官方文档:https://cloud.tencent.com/document/produ ...

最新文章

  1. Ubuntu 系统下终端界面在打开一个终端的快捷键
  2. ERROR Streaming result set com.mysql.jdbc.RowDataDynamic@1d5a7f6 is still active. No statements may
  3. 机器学习(二十三)——Beam Search, NLP机器翻译常用评价度量, 模型驱动 vs 数据驱动
  4. [缓存]迅雷下载原理
  5. SQL内连接、外连接、全连接、交叉连接、自连接、自然连接
  6. 手动启动_电站首台机组首次手动开机启动一次性成功
  7. python连接sql sever_R和python连接SQL sever 数据库操作
  8. 用微信公众号做淘宝优惠券查券搜券和返利机器人的详细配置教程
  9. 深度 DeepinXP-Lite V5.9
  10. Golang 并发之锁
  11. matlab [c, lags]=xcorr(y1,y2) 转python
  12. 拒酒词,好难找哟,留到有用
  13. Win11电脑名如何更改?Win11更改电脑名的方法
  14. 量化干货 | 机器学习能否助力风险投资?
  15. 实现QQ登陆(QQ互联)
  16. 1135 Is It A Red-Black Tree (30分)
  17. point-wise element-wise
  18. CC110L 与CC1101的区别
  19. python 两个冒号是什么成语_python查询双押词
  20. 单体内置对象_js基础-单体内置对象(Global、Math)

热门文章

  1. chatgpt赋能python:PythonSh-一个强大的Shell命令助手
  2. 数据分析之共同好友统计
  3. setTimeout/setInterval与requestAnimationFrame的区别?
  4. js 一段语音转换为文字 (暂时没有测试)
  5. intel无线网络管理服务器,intel服务器管理口地址
  6. html5学习教程大纲
  7. Palabos User Guide中文解读 | 第十二章 | 数据评估
  8. android 手机怎么测试,如何测试Android手机的流畅性?
  9. 如何发一条空白的朋友圈
  10. Unity网络开发实践