国庆了,用照片拼个中国地图吧?

几天前的给头像加国旗,当时我们 Python 代码来实现时,采用的思路是以头像做背景,向上贴中间透明的带有国旗的头像框图。

临近国庆了,我们把素材换一下,搞一个新玩法:准备些照片拼接成背景图,用中间透明的中国地图加以覆盖,即可生成一个酷炫的照片地图。(图片展示原因,未能显示岛屿等细节)

话不多说,以千玺照片来展示,效果如下:
在这里插入图片描述
效果可还行?把它用到合适的场景没准会有意外收获哦:比如将素材图片换成你的另一半的照片,再或者将地图轮廓素材换成其它喜欢的轮廓。

获取轮廓素材

原理简单,实现起来也不复杂,最紧要的是获取中间透明的地图轮廓图片。先在网上下载一个中国轮廓地图:

在这里插入图片描述

先在本地将其另存为 png 格式图片,再用修图软件打开。

接下来用魔棒工具(或快速选取工具)选中颜色区域进行删除操作,经过一番裁剪修正,将结果存为 png 格式图片。

在这里插入图片描述
(图片展示原因,未展示岛屿等细节)

素材图片拼接

我们完全可以用修图软件来将素材图片拼接成与地图轮廓.png 等大的背景图:

在这里插入图片描述

当然繁琐的过程采用 Python 来实现的话就是几行代码的工作量。大致要实现的就是根据地图轮廓图的尺寸,计算素材小图数量,利用 PIL 图片处理模块将小图拼接成与地图轮廓图同等大小的背景图,涉及代码如下:

# 读取地图轮廓图
img = Image.open("china.png")

w,h = img.size
#新建与主图一样大的白色底图
new_img = Image.new('RGB',(w,h),'#FFFFFF')

#设置小图尺寸
unit_size = 60

#根据小格尺寸,计算大图可容纳小图数量
y_index = h//unit_size
x_index = w//unit_size

pic_list = []
for item in os.listdir(folder):
    #对文件夹中的 jpg 图片格式筛选
    if item.endswith(".jpg") or item.endswith(".jpeg") :
        pic_list.append(item)

#获取素材图片数目
total = len(pic_list)
x=0
y=0

for i in range(x_index*y_index):
    #提醒进度的语句
    print(f"目前进度{i}/{x_index*y_index}")
    #对素材图缩放至小格大小
    test = Image.open(f"{folder}/" + pic_list[i%total]).resize((unit_size,unit_size), Image.ANTIALIAS)
    #将缩放成小格的素材图按顺序贴到白色底图上
    new_img.paste(test,(x*unit_size,y*unit_size))
    x+=1
    if x==x_index:
        x=0
        y+=1

print("素材图合成完毕!")
#将合成的素材图存至 out.jpg
new_img.save("out.jpg",quality=100)

地图轮廓贴图

有了背景图以及要覆盖在上面的地图轮廓图,只要将轮廓图贴在背景图上即可收工。

#读取合成后的素材图
src1 = Image.open("out.jpg")

#读取地图轮廓图
src2 = Image.open("china.png")

# 地图轮廓贴d到合成的背景图是那个
src1.paste(src2,(0,0),src2)

src1.save("result.png")
print("地图轮廓添加完毕!")

代码如上,仍然要注意这里贴图用的 paste 函数第三个参数是用来保证贴图时 png 格式图片的透明性。

回顾整个实现流程,思路简单,代码也不复杂,即使不想用代码直接用修图软件也可以快速操作实现。

但是还有一点想分享一下:

  1. 刚接触 PIL 图片处理模块时,就有过用图片拼接某种轮廓大图的想法。当时考虑的方向基本是计算轮廓内所有位置的坐标,去相应位置贴图拼接,感觉运算太过复杂就放弃了。此次用轮廓来向背景图贴图的设计,倒是一种全新的思路去将拼接轮廓的想法变相实现了,体验还不错。

  2. 类似的想法也有不少,好多问题都是当时觉得超出能力范围或者感觉基本没法实现。等到后续有了其它相应知识储备或者新的思路时,问题反而会不攻自破了,这也是非常好的体验。

以上,感谢阅读~

相关代码和图片素材已上传 GitHub,下载链接:
https://github.com/pengfexue2/china_map.git

最后,也想向你推荐下我记录自学 Python、前端以及微信小程序开发的公众号:TEDxPY,有问题或建议欢迎来联系

发布了70 篇原创文章 · 获赞 46 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40796925/article/details/101614870