Python+PIL 轻松制作九宫格图片

一个尺寸自适应的图片切割器,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}')
        return op_len
    
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值