做一个炫酷朋友圈的九宫格图 | 周末学习

本文已参与周末学习计划,点击链接查看详情:周末学习

先简单梳理下思路:

  • 读取初始照片
  • 比较照片的宽高,数值较大的作为边长生成以白色为背景的大正方形图
  • 将大正方形图进行切割,按照 3*3 比列,变成 9 个小图
  • 保存小图

基本思路有了,那就开始敲代码吧。

这个小功能的实现利用了 Python 中的一个图形处理库:Pillow 。

image.png

Pillow 是从著名的 Python 图像处理库 PIL 发展出来的一个分支。通过 Pillow 可以实现图像压缩和图像处理等操作。安装很简单,师兄们自己来吧。思路就按照上面的来,

1、读取照片

先来引入库,并获取当前文件所在文件夹:

from PIL import Image
import os

__author__ = 'fiz'

#当前文件所在文件夹
DIR_NAME = os.path.dirname( os.path.abspath(__file__) )
复制代码

老规矩当模块直接被运行的时候,执行一个我们自己封装的函数

from PIL import Image
import os

__author__ = 'fiz'

#当前文件所在文件夹
DIR_NAME = os.path.dirname( os.path.abspath(__file__) )

if __name__ == '__main__':
    fizRun()  
复制代码

在 fishcRun() 中我们来读取本地图片:

from PIL import Image
import os

__author__ = 'fiz'

#当前文件所在文件夹
DIR_NAME = os.path.dirname( os.path.abspath(__file__) )

def fizRun():
    # 读取本地文件
    file_path = os.path.join(DIR_NAME, 'demo.jpg')
    image = Image.open(file_path)
    print('程序结束啦!')

if __name__ == '__main__':
    fizRun()
复制代码

好啦,图片就读取到了。

2、填充原图形的背景,生成大正方形图

这个很好理解,如果是标准正方形,宽高一样,我们直接 3 等分即可。如果宽高不等呢?我们就给它加个白色背景,这样切出来,发出去也看不出来大小不等。宽高不等就又可以分成两种情况:宽大于高,高大于宽。如果是宽大与高,就按照宽的尺寸,设置高,多出来的部分,加填充白色背景。反之如果高大于宽,就按照高的尺寸,设置宽,多出来的部分,加填充白色背景。分析的很清楚啦,动手写成代码吧。先在 fishcRun() 中创建一个代表填充的 fill_images(image)。然后按照上面流程写代码:

from PIL import Image
import os

__author__ = 'fiz'

#当前文件所在文件夹
DIR_NAME = os.path.dirname( os.path.abspath(__file__) )

def fill_images(image):
    """ 填充正方形白色背景图片 """
    width, height = image.size  # 获取图片的宽高
    side = max(width, height)  # 对比宽和高哪个大

    # 新生成的图片是正方形的,边长取大的,背景设置白色
    new_image = Image.new(image.mode, (side, side), color='white')

    # 根据尺寸不同,将原图片放入新建的空白图片中部
    if width > height:
        new_image.paste(image, (0, int((side - height) / 2)))
    else:
        new_image.paste(image, (int((side - width) / 2), 0))
    return new_image

def fizRun():
     # 读取本地文件
    file_path = os.path.join(DIR_NAME, 'demo.jpg')
    image = Image.open(file_path)
    # 填充
    image = fill_images(image)

    print('程序结束啦!')

if __name__ == '__main__':
    fizRun()  
复制代码

3、切割图
执行完 fill_images() 就有了一张正方形图。切割不难,按照宽或者高(反正都一样)除以 3 取整即可。然后保存每一个切出来的图。创建 cut_images(image) 代表切图。
这就不附上代码了。最后用save_images来保存就完成了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享