【相关学习推荐:python教程】
文章目录
前言Github效果实现过程整体代码
前言
看电影的时候发现一个照片墙的功能,觉得这样生成照片挺好玩的,于是就动手用Python做了一下,觉得用来作照片纪念的效果可能会不错。
P:后面了解到我想做的功能叫蒙太奇拼图,所以这篇博客记录先留着,闲下来会去看一下蒙太奇拼图的算法
Github
https://github.com/jiandi1027/photo.git
立即学习“Python免费学习笔记(深入)”;
效果
实现过程
1.获取图片文件夹的图片个数N,将底图拆分成XY块区域,且使X * Y(为了保证整体的协调,会舍弃几张图片,比如5张时可能只取22的4张图片)
# 打开图片 base = Image.open(baseImgPath) base = base.convert('RGBA') # 获取图片文件夹图片并打乱顺序 files = glob.glob(imagesPath + '/*.*') random.shuffle(files) # 图片数量 num = len(files)# 底图大小 x = base.size[0] y = base.size[1] # 每张图片数量 这个公式是为了xNum * yNum 的总图片数量2.遍历文件夹的图片,依次填充生成最终合成图
for file in files: fromImage = Image.open(file) i = int(num % xNum) j = int(num / xNum) out = fromImage.resize((xSize, ySize), Image.ANTIALIAS).convert('RGBA') toImage.paste(out, (i * xSize, j * ySize)) toImage = toImage.convert('RGBA') img = Image.blend(base, toImage, 0.3) # 显示图片 photo = ImageTk.PhotoImage(img) showLabel.config(image=photo) showLabel.image = photo if num3.生成结束后保存图片
toImage.save(‘generator.png’)
img.save(“final.png”)
4.建立可视化界面
5.Pyinstaller生成exe可执行文件
安装pyinstaller模块,执行命令生成exe文件pyinstaller -F -w test.py (-w就是取消窗口)登录后复制
整体代码
Python的语法和设计规范还没学过,所以代码规范代码复用之类的可能会有点不到位,本博文主要是一个思路与整体流程的记录。
后续又优化了一下一些特效,比如合成图片采用随机位置,增加黑白,流年等显示特效,透明度自选等。import PIL.Image as Imageimport globimport randomimport tkinter.filedialogfrom tkinter.filedialog import askdirectory, Label, Button, Radiobutton, Entryimport threadingimport numpy as npfrom PIL import ImageTkalpha = 0.3imagesPath = ''# 滑动条回调 修改透明度def resize(ev=None): global alpha alpha = scale.get() / 100# 黑白def blackWithe(image): # r,g,b = r*0.299+g*0.587+b*0.114 im = np.asarray(image.convert('RGB')) trans = np.array([[0.299, 0.587, 0.114], [0.299, 0.587, 0.114], [0.299, 0.587, 0.114]]).transpose() im = np.dot(im, trans) return Image.fromarray(np.array(im).astype('uint8'))# 流年def fleeting(image, params=12): im = np.asarray(image.convert('RGB')) im1 = np.sqrt(im * [1.0, 0.0, 0.0]) * params im2 = im * [0.0, 1.0, 1.0] im = im1 + im2 return Image.fromarray(np.array(im).astype('uint8'))# 旧电影def oldFilm(image): im = np.asarray(image.convert('RGB')) # r=r*0.393+g*0.769+b*0.189 g=r*0.349+g*0.686+b*0.168 b=r*0.272+g*0.534b*0.131 trans = np.array([[0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131]]).transpose() # clip 超过255的颜色置为255 im = np.dot(im, trans).clip(max=255) return Image.fromarray(np.array(im).astype('uint8'))# 反色def reverse(image): im = 255 - np.asarray(image.convert('RGB')) return Image.fromarray(np.array(im).astype('uint8'))def chooseBaseImagePath(): name = tkinter.filedialog.askopenfilename() if name != '': global baseImgPath baseImgPath = name baseImageLabel.config(text=name) baseImg = Image.open(baseImgPath) widthEntry.delete(0, tkinter.END) heightEntry.delete(0, tkinter.END) widthEntry.insert(0, baseImg.size[0]) heightEntry.insert(0, baseImg.size[1]) else: baseImageLabel.config(text="您没有选择任何文件")def chooseImagesPath(): name = askdirectory() if name != '': global imagesPath imagesPath = name ImagesLabel.config(text=name) else: ImagesLabel.config(text="您没有选择任何文件")def thread_it(func, *args): # 创建 t = threading.Thread(target=func, args=args) # 守护 !!! t.setDaemon(True) # 启动 t.start()def test(): MyThread(1, "Thread-1", 1).start()baseImgPath = ''def generator(): baseImg = Image.open(baseImgPath) baseImg = baseImg.convert('RGBA') files = glob.glob(imagesPath + '/*.*') # 获取图片 random.shuffle(files) num = len(files) # 模板图片大小 x = baseImg.size[0] y = baseImg.size[1] # 每张图片数量 这个公式是为了xNum * yNum 的总图片数量想了解更多编程学习,敬请关注php培训栏目!登录后复制
以上就是Python照片合成的方法详解的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2248191.html