Python照片合成的方法详解

Python照片合成的方法详解

相关学习推荐: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 num 

3.生成结束后保存图片
toImage.save(‘generator.png’)
img.save(“final.png”)
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190805150649966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoaWppYW5kaQ==,size_16,color_FFFFFF,t_70
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

(0)
上一篇 2025年2月26日 22:50:14
下一篇 2025年2月20日 00:18:16

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python如何导出微信公众号文章

    【相关学习推荐:python教程】 1.安装wkhtmltopdf 下载地址:https://wkhtmltopdf.org/downloads.html  我测试用的是windows的,下载安装后结果如下 立即学习“Python免费学习笔…

    2025年2月26日
    200
  • python的用途有哪些?

    python用途有:Web开发、网络爬虫、人工智能、数据分析、自动化运维、系统编程、图形处理、数学处理、文本处理、数据库编程、网络编程、多媒体应用(例游戏开发)等。 为什么这么多人学Python呢?很多初学者都听说python很火,可是为啥…

    2025年2月26日
    200
  • 如何用python画猪头

    用python画猪头的方法:首先设置画布和画笔,代码为【a.screensize(400,300)a.setup(width=400,height=300)】;然后画脸型,代码为【.goto(-100,100)】;最后留存图像在画布上即可。…

    2025年2月26日
    200
  • python 33个保留字是什么意思

    python 33个保留字的意思是:1、【and】用于表达式运算,逻辑与操作;2、【as】用于类型转换;3、【assert】用于判断变量或条件表达式的值是否为真;4、【break】中断循环语句的执行。 【相关学习推荐:python视频】 p…

    2025年2月26日
    200
  • 巧妙解决Python多线程死锁问题

    【相关学习推荐:python视频】 今天是Python专题的第25篇文章,我们一起来聊聊多线程开发当中死锁的问题。 死锁 死锁的原理非常简单,用一句话就可以描述完。就是当多线程访问多个锁的时候,不同的锁被不同的线程持有,它们都在等待其他线程…

    2025年2月26日
    200
  • JSON在Python中的使用介绍

    【相关学习推荐:python视频】 JSON介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programmin…

    2025年2月26日
    200
  • 使用Python 搭建自己的区块链

    【相关学习推荐:python教程】 你是否会和我一样,对加密数字货币底层的区块链技术非常感兴趣,特别想了解他们的运行机制。 但是学习区块链技术并非一帆风顺,我看多了大量的视频教程还有各种课程,最终的感觉就是真正可用的实战课程太少。 我喜欢在…

    2025年2月26日 编程技术
    200
  • python如何产生10个不同的随机数

    python产生10个不同随机数的方法:首先创建一个result的结果空列表;然后循环直到result的长度超过10退出循环,循环里面随机生成一个1-10之间的数;最后查看生成的num随机数是否在result列表里,不在就添加进去。 【相关…

    2025年2月26日 编程技术
    200
  • 关于Pyzmq介绍

    【相关学习推荐:python教程】 Pyzmq介绍 ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。 是一个消息处理队列…

    2025年2月26日
    200
  • python如何随机读取目录文件

    python随机读取目录文件的方法是使用python的模块【random argparse shutil】读取即可,其代码语句为【for x in os.listdir(path),if x.endswith(‘jpg&#821…

    2025年2月26日
    200

发表回复

登录后才能评论