无限翻折!Python教你制作表白贺卡

论坛 期权论坛 期权     
Python爱好者社区   2019-6-16 04:40   3090   0

◆ ◆ ◆
作者 | 致宏
广州大学数学系
一年一度的撒狗粮节已经过去
不知道大家是过上了甜蜜的二人生活
还是每天抓耳挠腮地熬夜加班

如果你正犹豫怎么行动
下边这张创意卡片或许可以给你助助力



"我喜欢你"× ∞



可设置交替画面

卡片效果不错,制作方法如下

Ps 制作
1.  绘制框线图



2. 图片裁切



3. 分组填充



4. 打印,折纸


图片裁切比较费时
卡片多了容易忙不过来
这时候,万能工具Python 就该登场了。



学习一个新工具,最快的上手方式自然是
不断使用这一工具
Python 有PIL,OpenCV,Scikit-Image 等
丰富的图片处理库,正好借这个机会
熟悉PIL库的函数使用

Python 编码
编程目的:输入图片,自动生成成品图
函数代码如下:
  1. #输入:被粘贴图片,粘贴图片,小块尺寸,粘贴位置def pic_paste(img,pic,size,location):    im = Image.open(pic) #粘贴图片im    #裁剪图片    [width,height] = im.size #图片信息     l = min (height,width) #取短边    a = l//2    l = 2*a        #切块顺序,左上,右上,右下,左下    boxs = [(0,0,a,a),(a,0,l,a),(a,a,l,l),(0,a,a,l)]    slice_list = [im.crop(i) for i in boxs] #存储切块        #斜切拉伸    pictures = [] #储存拉伸后的图片    for i,pic in enumerate(slice_list):        pic = pic.rotate(i*90-45,expand=True)         #旋转图片,角度分别为 -45,45,135,-135 (逆时针)        pictures.append(pic.resize(size)) #拉伸并保存        #粘贴图像    x,y = location     for i,pic in enumerate(pictures):        img.paste(pic,(x+i*w,y))    img.paste(pictures[0],(x+4*w,y)) #末尾追加    return img
复制代码
主函数代码
  1. from math import sqrtfrom PIL import Imageh = 300 #设定裁剪方块像素w = int(300*sqrt(2))img1 = Image.new("RGBA",(int(4.5*w),int(2.5*h)),'black') #新建空白图片img2 = Image.new("RGBA",(int(4.5*w),int(2.5*h)),'black') #尺寸 4.5×2.5 #输入图片pic1 = input('Input picture names\nPic1:')pic2 = input('Pic2:')pic3 = input('Pic3:')pic4 = input('Pic4:')#裁剪并粘贴pic_paste(img1,pic1,(w,h),(0,0)) #位置1pic_paste(img1,pic1,(w,h),(0,2*h)) #位置5pic_paste(img2,pic2,(w,h),(-w//2,h//2))#位置2pic_paste(img1,pic3,(w,h),(0,h)) #位置3pic_paste(img2,pic4,(w,h),(-w//2,-h//2))#位置0pic_paste(img2,pic4,(w,h),(-w//2,h+h//2))#位置4im = Image.blend(img1,img2,1) #图片融合im = im.point(lambda i:i*2)im.save('output.png')input('输出完毕!')
复制代码
案例中用了Image模块函数,下边逐个介绍
  1. from PIL import Image #导入模块
复制代码
1.读入图片 Image.open
  1. im = Image.open(picture_name)
复制代码
2.获取图片大小 .size
  1. [width,height] = im.size
复制代码
3.切块 .crop
  1. im.crop(box=None)#box为四元数组,标记盒子的左上与右下位置
复制代码
4.图片旋转 .rotate
  1. im.rotate(angle, resample=0, expand=0, center=None, translate=None)#expend设置图片旋转后的大小自适应
复制代码
5.拉伸图片 .resize
  1. im.resize(size, resample=0, box=None)
复制代码
6.粘贴图片 .paste
  1. im.paste(pic,(x,y), mask=None) #把pic粘贴到img的(x,y)位置
复制代码
7.新建空白图片 Image.new
  1. im.paste(pic,(x,y), mask=None) #把pic粘贴到img的(x,y)位置
复制代码
8.图片混合 Image.blend
  1. Image.blend(img1,img2,alpha)#输出 :img1 * (1.0 - alpha) + img2 * alpha
复制代码
9.点操作 .point
  1. im = im.point(lambda i:i*2)#像素增强100%
复制代码
- 小结 -
Python 编程制卡
相比 Photoshop 省下了不少时间
如果是电脑小白,也不必担心
后台回复”四阶折纸”
获取链接,制作你的专属贺卡!



程序制图

实际上,无限翻折卡片有好几个家族
上边提到的只是其中一种

n阶无限翻折


三阶翻折



四阶翻折

通过简单的数学推导,容易证明
n阶翻折(n≥3) 均存在

n阶卡片的 p图 难度增加
但 Python 编程却很简单
感兴趣的话,点击在看,有机会再开更下篇



喜欢,就点个赞再走呗~
感谢阅读
推荐阅读:
1:互联网薅羊毛指南
2:互联网人与前公司的爱恨情仇
3:任正非:5G 背后有个不谈恋爱的小伙子
4:2018年Python爱好者社区历史文章合集(作者篇)
5:2018年终精心整理|Python爱好者社区历史文章合集(类型篇)


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:155
帖子:32
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP