
之前做ppt的时候,一直想做这种图,但是一直没有找到合适的图片处理软件可以做,正好最近接触PIL包,那么就用PIL来写个代码实现以下吧!
生成背景墙的,还是按照三步走的策略:下载图片、更改图片为统一尺寸(不是裁剪!不是裁剪!不是裁剪!)、生成背景墙。
1.下载图片
with open('.\src.txt','r',encoding='utf-8') as f:
i=1
for each in f:
urllib.request.urlretrieve(('https:'+each),(str(i)+ ".jpg"))
i+=1
print(i)
time.sleep(random.choice(range(1,3)))
2.更改图片尺寸
观察下载后的头像图片,会发现每个头像的大小和尺寸不一致。这样子,如果直接做背景墙的话,会提示image do not match的错误。因此在进行制作背景墙之前,需要把所有的图片更改成统一的尺寸。并保证所有的头像图片存放在path路径下面的一个文件夹下面,并且最好此path路径下只有一个文件夹。
path = "E:/数据学习资料/自己做的小项目/爬取简书推荐作者/src/"
dirlist = []
for root, dirs, files in os.walk(path):
for dir in dirs :
dirlist.append(dir)
print(dirlist) #看路径下有几个文件夹
for dir in dirlist:
images = [] # images in each folder
for root, dirs, files in os.walk(path+dir): # traverse each folder
print(path+dir+'')
i=1
for file in files: #遍历文件夹中的每一个文件
print(file)
images.append(Image.open(path+dir+'/'+file))
im=Image.open(path+dir+'/'+file)
im=im.convert('RGBA')
width, height = im.size
width=100 #修改图片的宽度
height=100 #修改图片的高度
resizedim=im.resize((width,height)) #修改图片的尺寸
name=path+str(i)+'.jpg' #定义图片名称
resizedim.save(name) #保存图片
i+=1
3.生成背景墙
按照下面这个代码里面进行相应的参数修改,运行之后就能在path路径下找到生成的图片了。
import os
from PIL import Image
UNIT_SIZE = 100 # the size of image 根据实际情况修改
def pinjie(images,num):
target = Image.new('RGB', (UNIT_SIZE*20, UNIT_SIZE*8)) # result is 80*2 根据实际情况修改
for j in range(1,9): #这里选择的是8列,因此是1-9,其他情况可以看着修改成1-n
n=20*(j-1) #因为是20张图片一行,所以是20,换成别的数字需要修改
m=20*j
for i in range(n,m):
left=UNIT_SIZE*(i-n)
upper=UNIT_SIZE*(j-1)
# right=left+UNIT_SIZE #左上有了,右下可以不写
# lower=upper+UNIT_SIZE
target.paste(images[i], (left,upper))
quality_value = 100
target.save(path+dirlist[num]+'.jpg', quality = quality_value)
path = "E:/数据学习资料/自己做的小项目/爬取简书推荐作者/src/"
dirlist = [] # all dir name
for root, dirs, files in os.walk(path):
for dir in dirs :
dirlist.append(dir) #找到path下所有的文件名,最好只有一个
num = 0
for dir in dirlist:
images = [] # images in each folder
for root, dirs, files in os.walk(path+dir): # traverse each folder
print(path+dir+'')
for file in files:
images.append(Image.open(path+dir+'/'+file)) #注意这个地方,images里面不是直接添加图片地址,而是先打开,避免了转义的发生
pinjie(images,num) #加这个num是连续生成多张图片的意思
num +=1
print(num)
images = []
网友评论