一个尺寸自适应的图片切割器,Python实现,PIL,Image
前言
520前夕,又接了个活。对方的需求就是把一张照片切割成九宫格,这样发微信朋友圈感觉更炫酷一点。比如说520当天发对象的照片吖,就可以发九张凑成一张完整的。层次感一下子就上去了嘻嘻。
预备工作
这里需要用到PIL库,所以要先安装好这个库,
pip install pillow
整体思路
先说一下整体的思路。其实这个工作的流程就是:读取图片,并且按照不同的区域进行切割,最后把切割下来的图片保存起来就好了。但是有几个问题,
问题1,方块问题;
读取到的图片不一定而且几乎总不是正方形,因此不能直接长宽三等分切割。
问题2,方块边长问题;
长宽不一定能被三整除,所以要做一定的调整。
问题3,块数兼容问题
切割成九块和四块,能否实现兼容?
问题4,起始坐标问题
切割的图片所包含的区域与原图的关系如何?万一我一张长方形的图片,关键图像信息在右侧,结果一切把左边的无效信息给切下来了怎么处理?因此需要设置起始切割坐标,规定从该坐标开始进行切割。
问题5,方块收缩问题。
假设我切九宫格,不妨把每个方块称为“小方块”,九张图凑在一起的称为“大方块”,那么,如果原图中关键信息的面积比较小,那么我就想要调整大方块的边长,也就是说大方块的边长必须是可调整的。
解决以上问题,一个图片切割器就基本完成了。
Step1 读取图片,获取尺寸
首先要用到open方法来读取图片,并且使用size方法获取图片的尺寸
from PIL import Image
im = Image.open('--filepath--\\filename.jpg')
pic_x, pic_y = im.size
也可以不写路径,不写路径的话那就默认为当前的文件夹。
Step2计算新图片的边长
所谓“新图片”就是指前文所说的“大方块”,我的思路是这样的:
获得了原图的长宽信息后,以短边作为大方块的边长,这里要考虑两种情况:
第一:切9块:如果短边不能被3整除,那就令其-1再作判断,一直到其可以被3整除为止。
第二:切4块,如果短边不能被2整除,则令其-1.
因此我写了一个函数来计算大方块的边长。需要以原图的长、宽,以及切割块数作参数
def get_cubic(size_x, size_y, num):
if num == 9:
if size_x < size_y:
while size_x % 3 != 0:
size_x = size_x - 1
return size_x
else:
while size_y % 3 != 0:
size_y = size_y - 1
return size_y
else:
return (size_x - size_x % 2) if size_x < size_y else (size_y - size_y % 2)
这时,便有大方块边长
pic_sum = 9
cbc_len = get_cubic(pic_x, pic_y, pic_sum)
至此,前三个问题都被解决。
这时要考虑问题4,方块收缩问题。方块收缩问题本质上就是对大方块的边长做调整因此写一个函数,以一个变量(不妨称之为“收缩常量”)作参数,返回收缩后边长就好了
当然,如果收缩常量太大,那么切割下来的图片质量就会差,或者直接把边长收缩成负值,那都没有意义,因此规定收缩后边长不能低于50.收缩以后,再根据方块数重新计算大方块边长。
def cubic_shrink(shrink_constant):
flag = 0 if shrink_constant >= cbc_len - 50 else 3 if pic_sum == 9 else 2
if flag:
op_len = cbc_len - shrink_constant
while (op_len) % flag != 0:
op_len = op_len - 1
print(f'with shrinking constant of {
shrink_constant}, now the length of the big cubic was adjusted to {
op_len}')