马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2020-10-27 11:35 编辑
前几日逛吹水阁,看完潘石屹大佬通过 Python 考试的帖子(传送门),被里面的 Tag 触动了:
对吼,如果 Python 不能用来搞事情,将失去多少乐趣!
今天小师妹就再教大家一招!
都看过朋友圈(其他社交平台同理)这样的 9 宫格图吧:
(PS:代码不会的不加好友 )
用软件可以实现,但作为程序员,肯定要写代码咯。
先简单梳理下思路:
- 读取初始照片
- 比较照片的宽高,数值较大的作为边长生成以白色为背景的大正方形图
- 将大正方形图进行切割,按照 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 = [image.crop(box) for box in box_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) 来保存成果:
保存,测试一下,跑完后,如果你看到:
恭喜成功,为了让你们自己写,源码收费高一些(劝退):
源码.zip
(388.93 KB, 下载次数: 48, 售价: 50 鱼币)
|