鱼C-小师妹 发表于 2020-5-27 16:22:14

做一个炫酷朋友圈的九宫格图吧!

本帖最后由 不二如是 于 2020-10-27 11:35 编辑

https://www.bilibili.com/video/BV15t4y1y7jX

前几日逛吹水阁,看完潘石屹大佬通过 Python 考试的帖子(传送门),被里面的 Tag 触动了:
https://xxx.ilovefishc.com/forum/202005/26/085614xdwt4dtt4zhh5htw.png.thumb.jpg

对吼,如果 Python 不能用来搞事情,将失去多少乐趣!

今天小师妹就再教大家一招!

都看过朋友圈(其他社交平台同理)这样的 9 宫格图吧:

(PS:代码不会的不加好友{:10_327:} )

用软件可以实现,但作为程序员,肯定要写代码咯。

先简单梳理下思路:


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

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

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


官网:传送门

Pillow 是从著名的 Python 图像处理库 PIL 发展出来的一个分支。

通过 Pillow 可以实现图像压缩和图像处理等操作。

安装很简单,师兄们自己来吧。

思路就按照上面的来,


1、读取照片

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

from PIL import Image
import os

__author__ = '鱼C-小师妹'

#当前文件所在文件夹
DIR_NAME = os.path.dirname( os.path.abspath(__file__) )
老规矩当模块直接被运行的时候,执行一个我们自己封装的函数:

from PIL import Image
import os

__author__ = '鱼C-小师妹'

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

if __name__ == '__main__':
    fishcRun()
在 fishcRun() 中我们来读取本地图片:

from PIL import Image
import os

__author__ = '鱼C-小师妹'

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

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

if __name__ == '__main__':
    fishcRun()
好啦,图片就读取到了。

简单测试下,启动脚本,看到控制台输出:


证明现有程序没问题啦,继续下一步。


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

这个很好理解,如果是标准正方形,宽高一样,我们直接 3 等分即可。

如果宽高不等呢?

我们就给它加个白色背景,这样切出来,发出去也看不出来大小不等。

宽高不等就又可以分成两种情况:宽大于高,高大于宽。

如果是宽大与高,就按照宽的尺寸,设置高,多出来的部分,加填充白色背景。

反之如果高大于宽,就按照高的尺寸,设置宽,多出来的部分,加填充白色背景。

分析的很清楚啦,动手写成代码吧。

先在 fishcRun() 中创建一个代表填充的 fill_images(image)。

然后按照上面流程写代码:

from PIL import Image
import os

__author__ = '鱼C-小师妹'

#当前文件所在文件夹
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 fishcRun():
   # 读取本地文件
    file_path = os.path.join(DIR_NAME, 'demo.jpg')
    image = Image.open(file_path)
    # 填充
    image = fill_images(image)

    print('程序结束啦!')

if __name__ == '__main__':
    fishcRun()
好啦,注释的很清楚啦,自己看。


3、切割图

执行完 fill_images() 就有了一张正方形图。

切割不难,按照宽或者高(反正都一样)除以 3 取整即可。

然后保存每一个切出来的图。

创建 cut_images(image) 代表切图,实现如下:

from PIL import Image
import os

__author__ = '鱼C-小师妹'

#当前文件所在文件夹
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 cut_images(image):
    """ 切割原图 """
    width, height = image.size
    one_third_width = int(width / 3)# 三分之一正方形线像素

    # 保存每一个小切图的区域
    box_list = []

    """
    切图区域是矩形,位置由对角线的两个点(左上,右下)确定,
    而 crop() 实际要传入四个参数(left, upper, right, lower)
    """
    for x in range(3):
      for y in range(3):
            left = x * one_third_width# 左像素
            upper = y * one_third_width# 上像素
            right = (x + 1) * one_third_width# 右像素
            lower = (y + 1) * one_third_width# 下像素
            box = (left, upper, right, lower)
            box_list.append(box)

    image_list =
    return image_list

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

    print('程序结束啦!')

if __name__ == '__main__':
    fishcRun()
切都切好了,剩下就是把图保存出来了。


4、保存切割图

我们最终要的是 9 张切割图,上面搞定定后,写个 save_images(image_list) 来保存成果:

**** Hidden Message *****

保存,测试一下,跑完后,如果你看到:



恭喜成功,为了让你们自己写,源码收费高一些(劝退):

KevinHu 发表于 2020-5-27 16:27:04

过二十指的是什么?鱼币?荣誉?还是贡献{:9_241:}

老八秘制 发表于 2020-5-27 16:31:09

KevinHu 发表于 2020-5-27 16:27
过二十指的是什么?鱼币?荣誉?还是贡献

20个人(

KevinHu 发表于 2020-5-27 16:33:03

老八秘制 发表于 2020-5-27 16:31
20个人(

这个求评分的策略{:10_250:}太高级了……

qiuyouzhi 发表于 2020-5-27 16:54:02

前排支持

不二如是 发表于 2020-5-27 17:07:29

KevinHu 发表于 2020-5-27 16:27
过二十指的是什么?鱼币?荣誉?还是贡献

不是写了荣誉?

KevinHu 发表于 2020-5-27 17:07:57

不二如是 发表于 2020-5-27 17:07
不是写了荣誉?

刚才好像没写{:10_256:}

KevinHu 发表于 2020-5-27 17:08:34

不二如是 发表于 2020-5-27 17:07
不是写了荣誉?

唉是不是不二你改的{:10_256:}

_2_ 发表于 2020-5-27 19:54:27

老八秘制 发表于 2020-5-27 16:31
20个人(

不就要荣誉嘛,
给点电脑又不会崩溃{:10_256:}

鱼C-小师妹 发表于 2020-5-29 18:07:12

_2_ 发表于 2020-5-27 19:54
不就要荣誉嘛,
给点电脑又不会崩溃

对滴

Mavey 发表于 2020-5-31 14:48:54

{:10_254:}

永恒的蓝色梦想 发表于 2020-5-31 17:37:38

看看

s0mnus 发表于 2020-5-31 21:02:38

666

lqm232 发表于 2020-6-7 10:08:50

代码学习

nizitao 发表于 2020-6-7 17:23:17

666

xiaosi4081 发表于 2020-6-8 12:42:44

源码不是已经在上面了吗?怎么还要弄福附件

小矫情 发表于 2020-6-8 15:31:37

小师妹好厉害

银灰色 发表于 2020-6-9 15:53:57

支持

demo123 发表于 2020-6-10 17:49:57

{:5_108:}

Mike_python小 发表于 2020-6-10 17:59:26

看看
页: [1] 2 3
查看完整版本: 做一个炫酷朋友圈的九宫格图吧!