设计思路:
使用Pillow
分别构建同样大小的图片text.jpg
、wall.jpg
,再根据两张图片的相同位置的像素情况构建final.jpg
实现方案
首先将图片统一重命名待用。然后构建text.jpg
来存放照片墙的文字图层。之后随机选择照片,调整其大小,按顺序粘贴组成一张大的图片wall.jpg
来存放照片墙的背景图层。最后新建一张空的大小一样的图片final.jpg
。通过Pillow.getpixel()
获取两张图的像素信息,逐个像素进行比较,若text.jpg
中的一点像素为大红色,则对final.jpg
的同一点使用Pillow.putpixel()
赋同一点处wall.jpg
的像素信息。
关键代码说明
构建文字图层
1 2 3 4 5 6
| text="41802198" ft=ImageFont.truetype("shuma.ttf", int(BIG_HEIGHT*1)) text_image=Image.new("RGB", (BIG_WIDTH,BIG_HEIGHT)) draw = ImageDraw.Draw(text_image) draw.text((0,0), text,font=ft,fill="red") text_image.save("text.jpg")
|
构建背景图层
1 2 3 4 5 6 7 8 9
| wall_image=Image.new("RGB", (BIG_WIDTH,BIG_HEIGHT))
for x in range(BIG_WIDTH//SMALL_WIDTH): for y in range(BIG_HEIGHT//SMALL_HEIGHT): num=random.randint(1,10) tmp=Image.open("photo/"+str(num)+".jpg") tmp=tmp.resize((SMALL_WIDTH,SMALL_HEIGHT),Image.NEAREST) wall_image.paste(tmp,(x*SMALL_WIDTH,y*SMALL_HEIGHT)) wall_image.save("wall.jpg")
|
构建最终图片
1 2 3 4 5 6 7 8 9
| wall_image=Image.new("RGB", (BIG_WIDTH,BIG_HEIGHT))
for x in range(BIG_WIDTH//SMALL_WIDTH): for y in range(BIG_HEIGHT//SMALL_HEIGHT): num=random.randint(1,10) tmp=Image.open("photo/"+str(num)+".jpg") tmp=tmp.resize((SMALL_WIDTH,SMALL_HEIGHT),Image.NEAREST) wall_image.paste(tmp,(x*SMALL_WIDTH,y*SMALL_HEIGHT)) wall_image.save("wall.jpg")
|
效果展示
![照片墙]()
心得体会
本次作业考察的主要对图片的操作,难度不大。需要我们对图片各种格式、通道有所了解。其余的无非就是一些简单的判断以及赋值。本次作业完成的方法有很多,每一种都能帮助我们更好地学习图片的相关知识,希望大家都能多尝试几种方法,学习到更多相关知识。
本作业已上传至Github以及Gitee,希望各位能点个star再走 :smile:。
GitHub
Gitee