有趣的图片

如何能让图片变得好玩?首先需要让它动起来!可如果是多张图片,我们还可以将其拼接起来组成gif动图,可一张图怎么玩?记得之前写过一个小练习,把一张图片拆分成九宫格的分片图。那么,能否由此下手整出点花样呢?先来看看最终实现的两种方案吧:

轮播闪现

分块加载

实现分析

命令行交互

首先,看过上面的两张动图,细心的朋友会发现,动图将原有的图片拆分为了25块,然后进行特定的拼接。那么只能拆分成25么,模式又该怎么选择呢?此时我们需要引入一个模块argparse,它是专门用作命令行参数配置的库。之前专门写过一篇针对该模块的总结文章,大家可以去看看:

对于python命令行,你应该这么做才专业

好了,回到当下内容,我们需要针对三项进行配置,图片路径、gif展示方式、拆分图片数量

# -*- coding: utf-8 -*-

# @Author : 王翔

# @WeChat : King_Uranus

# @公众号 : 清风Python

# @Date : 2019/9/22 22:11

# @Software : PyCharm

# @version :Python 3.7.3

# @File : FunnyPicture.py

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("-p", "--picture", required=True,

help="请填写所需制作的图片全路径")

parser.add_argument('-t', '--type', default='join',

choices=['join', 'alone'],

help="join为分块加载,alone为轮播闪现")

parser.add_argument("-n", "--split_number", type=int, default=9,

choices=[9, 16, 25, 36, 49, 64, 81, 100],

help="选择拆分的图片数量")

args = parser.parse_args()

有了这些参数,我们就可以开始编写代码了…

图片裁剪

图片的剪裁与拆分使用什么模块呢?**from PIL import Image**简单通过Pillow的Image就可以实现相关操作了!

看到gif图我们会发现上下存在部分的留白,这是为什么?因为不是每张图都是等宽高的,所以我们要事先准备一块白色的幕布,然后将图片居中贴在白色背景图上。幕布大小如何决定,取图片宽高的最大值,生成一张正方形的白色幕布。

...

from PIL import Image

img = Image.open(args.picture.replace('\\', '/'))

_width, _height = img.size

img_size = _width if _width > _height else _height

blank_image = Image.new(self.img_mode, (self.img_size, self.img_size), color='white')

blank_image.save(....)

...

之后,就方便我们进行拆分了。

朋友圈不能发动图

我们的gif做好了,可以朋友圈不能发动图,这该如何是好?其实只需3行代码就能把一个gif的图片转化为视频文件。

模块安装:pip install moviepy

# -*- coding: utf-8 -*-

# @Author : 王翔

# @WeChat : King_Uranus

# @公众号 : 清风Python

# @Date : 2019/9/22 22:11

# @Software : PyCharm

# @version :Python 3.7.3

# @File : FunnyPicture.py

import moviepy.editor as mp

clip = mp.VideoFileClip(filename)

clip.write_videofile('result.mp4')

没错,就是这么简单…但该模块封装了很多子模块,总体下载还是比较大的。我们在代码中自动引入该功能,同时生成gif与MP4文件。

总体代码

总体代码如下:

# -*- coding: utf-8 -*-

# @Author : 王翔

# @WeChat : King_Uranus

# @公众号 : 清风Python

# @Date : 2019/9/22 22:11

# @Software : PyCharm

# @version :Python 3.7.3

# @File : FunnyPicture.py

import argparse

from PIL import Image

import os

import copy

import moviepy.editor as mp

BasePath = os.path.dirname(os.path.realpath(__file__))

class FunnyPicture:

def __init__(self):

self.img_mode = None

self.img_size = None

self.blank_image = None

self.git_list = list()

# 获取图片名称(去除后缀名)

self.picture_name = os.path.splitext(os.path.split(args.picture)[1])[0]

self.save_path = os.path.join(BasePath, self.picture_name)

if not os.path.exists(self.save_path):

os.mkdir(self.save_path)

# 格式化图片路径

self.picture = self.resize_picture()

def resize_picture(self):

img = Image.open(args.picture.replace('\\', '/'))

self.img_mode = img.mode

_width, _height = img.size

self.img_size = _width if _width > _height else _height

self.blank_image = Image.new(self.img_mode, (self.img_size, self.img_size), color='white')

self.blank_image.save(os.path.join(self.save_path, '{}_blank.jpg'.format(self.picture_name)))

_image = copy.copy(self.blank_image)

if _width > _height:

_image.paste(img, (0, int((self.img_size - _height) / 2)))

else:

_image.paste(img, (int((self.img_size - _width) / 2), 0))

return _image

def split_picture(self):

size = int(args.split_number ** 0.5)

side_len = int(self.img_size / size)

_index = 1

blank_image = copy.copy(self.blank_image)

for i in range(0, size):

for j in range(0, size):

if args.type != "join":

blank_image = copy.copy(self.blank_image)

per_size = (j * side_len, i * side_len, (j + 1) * side_len, (i + 1) * side_len)

per_img = self.picture.crop(per_size)

blank_image.paste(per_img, (j * side_len, i * side_len))

self.git_list.append(copy.copy(blank_image))

# 希望保留部分图片内容的可以取消注释

# 中途的每一块局部图

# per_img.save(os.path.join(self.save_path, '{}_per{}.jpg'.format(self.picture_name, _index)))

# 动图的每一帧图片

# blank_image.save(os.path.join(self.save_path, '{}_per_gif{}.jpg'.format(self.picture_name, _index)))

_index += 1

def composite_gif(self):

images = []

im = Image.open(os.path.join(self.save_path, '{}_blank.jpg'.format(self.picture_name)))

for per_gif in self.git_list:

images.append(per_gif)

for i in range(10):

images.append(self.picture)

gif_name = "{}_result.gif".format(os.path.join(self.save_path, self.picture_name))

im.save(gif_name, save_all=True, loop=True, append_images=images, duration=200)

self.composite_mp4(gif_name)

@staticmethod

def composite_mp4(filename):

clip = mp.VideoFileClip(filename)

clip.write_videofile(os.path.splitext(filename)[0] + '.mp4')

if __name__ == '__main__':

parser = argparse.ArgumentParser()

parser.add_argument("-p", "--picture", required=True,

help="请填写所需制作的图片全路径")

parser.add_argument('-t', '--type', default='join',

choices=['join', 'alone'],

help="join为分块加载,alone为轮播闪现")

parser.add_argument("-n", "--split_number", type=int, default=9,

choices=[9, 16, 25, 36, 49, 64, 81, 100],

help="选择拆分的图片数量")

args = parser.parse_args()

main = FunnyPicture()

main.split_picture()

main.composite_gif()

关于打包

既然为了好玩,当然要打包成exe的可执行文件喽。但关于打包,需要说明两点:

1.通过pyinstaller打包的软件,会被杀软误报。解压、使用时需添加白名单。

2.刚才说到moviepy依赖的模块太多,打包会导致异常,所以未将次功能进行打包,如果喜欢创建视频的,可以使用3行命令单独执行下。

来看看打包效果:

python可以实现什么炫酷图形吗_如何把图片变得炫酷多彩,Python教你这样实现!...相关推荐

  1. python可以实现什么炫酷图形吗_我是Python小玩家,一行代码能做哪些炫酷的事情?...

    python之禅 image 一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 python3 -m http.server 8080 一行代码实现变量值互换 ...

  2. pr转场 卡通炫酷图形动画视频转场pr模板mogrt

    适用于开场视频.动作片.幻灯片.极限运动或舞蹈视频等等. 项目特点: 独特的过渡 4096×2304 分辨率 全彩控件 媒体占位符 包括视频教程 适用于 Premiere Pro 2021 及更高版本 ...

  3. 用python画的炫酷图形_太秀了,没想到这些既炫酷又能动的图竟然是用 Python 画的!...

    点击蓝色"Python空间"关注我丫 加个"星标",每天一起快乐的学习 选自TowardsDataScience    作者:Liana Mehrabyan 机 ...

  4. 用python画的炫酷图形_推荐一个炫酷Python 手绘图形库

    https://github.com/chenjiandongx/cutecharts 今天,给大家介绍一个很酷的 Python 手绘风格可视化神包:cutecharts.和 Matplotlib . ...

  5. python xml 创建多个同名子节点_果粉有福了!5分钟学会用Python统计自己最爱听的音乐...

    作为一个最狂热的果粉,喜欢用苹果来播放自己最爱的音乐,随时让音乐充满自己的生活.想统计自己哪些音乐才是自己最爱吗?想知道哪些音乐是自己第一次听见就相伴终身吗?下面用Python来完成您的心愿. 下面的 ...

  6. python中的排序方法都有哪些_几种常见的排序方法总结(Python)

    几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...

  7. python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...

    妹子图网站----前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们需 ...

  8. python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)

    最近在查阅斐波那契数列时,看到下面的文章,总结得非常好,于是自己上手使用 Python 练习并实现多种求解方法 守望:面试官问你斐波那契数列的时候不要高兴得太早​zhuanlan.zhihu.com ...

  9. android怎么让图片显示在button上面_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...

    ## **妹子图网站----前言** 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写`爬图片`这一件事情.希望可以做好. 为 ...

最新文章

  1. 详细的摄像头模组工作原理!!!(转)
  2. 计算机 连接ip,连接在Internet上的计算机都拥有IP地址。
  3. A different twist on pre-compiling JSPs--reference
  4. 成为一名优秀数据分析师的必经之路
  5. commons-lang3:DateUtils
  6. 腾讯获准在中国销售Switch游戏机 任天堂股价应声飙升逾14%
  7. linux机器不能上网,Deepin Linux 无法上网
  8. 解决jquery中全选点击第二次不生效的问题与分析
  9. 您不是订单管理的定向开发者_全面升级投放和营销能力 华为应用市场商业推广助力开发者高效增长...
  10. 谈:典型三种近场通信的特点以及未来趋势
  11. git与gitlab使用教程
  12. 服务器芯片将填补中国空白,3年迭代4次技术,芯片黑马填补国产空白,韩企的垄断被打破...
  13. 四位共阳极数码管显示函数_4位共阴极数码管单片机驱动
  14. win7怎么看计算机显卡内存大小,Win7系统怎么看显存?
  15. 2018.07.18【2018提高组】模拟C组
  16. 【运筹学】对偶理论 : 总结 ( 对偶理论 | 原问题与对偶问题对应关系 | 对偶理论的相关结论 ) ★★★
  17. Google 释出开源软件漏洞扫描工具 OSV-Scanner​
  18. 以太坊社区激励金计划:支持开发者利用去中心化技术改变世界
  19. 基于JavaSE标准化图书管理系统
  20. ssh连接报错的处理

热门文章

  1. 给IT人员支招:如何跟业务部门谈需求分析?(上)
  2. springboot vue elementui理发店预约系统源码
  3. 机器学习-常见聚类算法K-means,模糊c-均值,谱聚类 DBSCAN算法等
  4. 一种光谱无损的遥感数据融合方法——LiIFT插值融合(一)
  5. matlab面板数据处理程序,勒沙杰空间计量MATLAB(可做面板数据)
  6. 牛客刷题篇:客似云来 和 剪花布条(Java)
  7. jsp192ssm驾校报名预约管理系统
  8. 杀毒软件清除了硬盘数据怎么恢复
  9. 页面置灰filter: grayscale(1)
  10. 字节跳动,阿里又迎来了一大波裁员,快35岁的我该何去何从经验分享(阅读量10000+)