原创不易请勿抄袭
一个凌晨更新公众号的狗子
没错
是我本人
又到了一年一度办公园年卡的日子了,每年需要一张1寸照片,我的库存今年告罄
如果拿着一寸照片去冲印,商家那个冲印的价格可比冲印普通照片不知道贵了多少(目测10倍以上)
其实是一样的相纸啊
于是乎,为了省这点钱就自己排版好了,毕竟穷不是
如果选用工具的话,不会ps的推荐“光影魔术手v3.1.2”(最新版感觉不太好用)
but,作为一个技术宅,我当然是选择自己来实现啦!
话不多说,说干就干
思 路
一张证件照,尺寸比例可以不完全按照标准
按比例裁剪(1寸、2寸的比例不同)
缩放到标准尺寸
排版到5寸或者6寸照片上
照片尺寸
宽*高(单位:像素)
1寸照片:295*413
2寸照片:413*626
5寸照片(横版):1500*1050
6寸照片(横版):1800*1200
编程环境
python3 + pillow库
具体操作
1
裁剪
以1寸照片为例,其高:宽 = 1.4,为了使原始照片不失真,应该按照这个1.4的比例进行裁剪
若大于1.4说明高度多了,需要进行上下裁剪;若小于1.4说明宽度多了,需要进行左右裁剪。这里的裁剪均是对称平均裁剪
Image.crop((left, up, right, below))
参数:
需要四个参数,分别是目标照片的四个边线距离左边和上边的距离
值得注意的是:参数是一个元组,因此看起来有两对括号!
2
缩放
将已经调整好比例的照片进行标准缩放,标准如下(单位:像素):
1寸照片:295*413
2寸照片:413*626
Image.resize(width, height)
参数:
width:宽
heght:高
3 排版
先想好冲印5寸照片还是6寸照片,以及是需要1寸、2寸还是混合排版?
这两个因素都会影响到排版问题,主要是横or竖的问题
以5寸照片上排版1寸照片为例(5寸横版,1寸竖版,2*4排列),是这样滴:
在排列之前,我细心的用画笔画出了裁剪线,这样手残的人再也不用哆哆嗦嗦剪歪了
bk = Image.new("RGB", [WIDTH_5IN,HEIGHT_5IN], (255,255,255))# 创建一个5寸大小的,白色背景的画板
draw = ImageDraw.Draw(bk)# 创建画笔draw.line([(0,HEIGHT_5IN/2),(WIDTH_5IN,HEIGHT_5IN/2)],fill=128) # 横线,fill是填充颜色
新建画板就不多讲了,注意一下参数的位置,先宽后高,颜色参数其实有多种写法
这里主要讲一下怎么在画板上画线,其实是需要起点坐标和终点坐标,坐标原点是画板左上角,横轴向右x,纵轴向下y
还是画个图更直观
注意坐标的写法 [(起点x,起点y),(终点x,终点y)],坐标点必须为int类型
我这个画完是这样嘞(红色线部分),像不像冰格:
然后就是把照片贴上去,注意要放在每个“格子”的中心呦
Image.paste(photo, (photo左上角坐标))
因此,我们需要计算单个1寸照片在整个画板里左上角坐标,
还是画个图说明下:
先求每个小格子里中心点focus_point的坐标,然后根据1寸照片的大小求左上角坐标start_point。然后根据每个start_point循环把照片贴上去就好啦!
我生成的是这样嘞,看起来很完美啊!
同理,5寸照片排版2寸的。这里注意新建画板时候的尺寸,因为相当于是竖版照片
5寸照片混合排列1寸、2寸的:
注意一下
2寸照片旋转了90度,用到的函数中,参数必须写上expand=True
Image.rotate(90,expand=True))
如果没写这个参数默认是False,这样旋转后的照片是按照原来的大小,会有裁剪或者黑边,例如:
6寸照片排版1寸:
6寸照片排版2寸按照5寸照片的排版模式会有高度上的溢出
解决方法:新建画布时候按照6寸比例3:2进行适当的放大,因为冲印的时候也没要求就是标准大小嘛
比如,我将大小改为1950*1300
同理,6寸照片混合排列1寸、2寸的也是有溢出。修改完尺寸,混合排版的样子就多了去了,比如这样:
或者这样:
源代码
需要源代码的童鞋,请访问我的博客园地址获取
https://www.cnblogs.com/aby321/p/11805789.html
特别鸣谢
由衷感谢 薛老板 提供本人证件照
为表达本人的感激之情
在此为他 征友
有意者请在公众号内回复