又到了一年一度办公园年卡的日子了,每年需要一张一寸照片,库存今年告罄
如果拿着一寸照片去冲印,商家那个冲印的价格可比冲印普通照片不知道贵了多少呗(目测10倍以上)
其实是一样的相纸啊
于是乎,为了省这点钱就自己排版好了
如果选用工具的话,不会ps的推荐“光影魔术手v3.1.2”(最新版感觉不太好用)
but,作为一个技术宅,我当然是选择自己来实现啦!
话不多说,说干就干
思路:
1. 首先需要一张已经拍摄好的证件照,尺寸比例可以不完全按照标准
2. 按比例裁剪(1寸、2寸的比例不同)
3. 缩放到标准尺寸
4. 排版到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