【
相关学习推荐:
python教程
】
文章目录
前言
Github
效果
实现过程
整体代码
前言
看电影的时候发现一个照片墙的功能,觉得这样生成照片挺好玩的,于是就动手用Python做了一下,觉得用来作照片纪念的效果可能会不错。
P:后面了解到我想做的功能叫蒙太奇拼图,所以这篇博客记录先留着,闲下来会去看一下蒙太奇拼图的算法
Github
https://github.com/jiandi1027/photo.git
立即学习
“
Python免费学习笔记(深入)
”;
效果
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
实现过程
1.获取图片文件夹的图片个数N,将底图拆分成X
Y块区域,且使X * Y
2.遍历文件夹的图片,依次填充生成最终合成图
# 打开图片
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 的总图片数量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 < xNum * yNum:
num = num + 1pyinstaller -F -w test.py (-w就是取消窗口)import PIL.Image as Image
import glob
import random
import tkinter.filedialog
from tkinter.filedialog import askdirectory, Label, Button, Radiobutton, Entry
import threading
import numpy as np
from PIL import ImageTk
alpha = 0.3
imagesPath = ''
# 滑动条回调 修改透明度
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 的总图片数量