天天看点

元旦C位出道,用微信好友头像拼个中国地图吧!

几天前中秋节的时候用微信好友头像加生成祝福文字,当时用 Python 代码来实现时,采用的思路是结合微信好友头像和点阵字,弄成头像拼字。

    马上就元旦了,我们把素材换一下,搞一个新玩法:准备用好友头像拼接成背景图,用中间透明的中国地图加以覆盖,即可生成一个酷炫的照片地图。

话不多说,效果如下:

元旦C位出道,用微信好友头像拼个中国地图吧!
(图片展示原因,未能显示岛屿等细节)

整体思路是这样婶儿的

  • 获取所有微信好友头像
  • 准备一张透明的中国地图
  • 把微信好友头像作成照片墙
  • 黏合照片墙和透明地图即可

获取好友头像

    这个我在之前用微信好友头像生成汉字时已经做好了、直接拿过来用即可。

    如果你不知道怎么获取微信好友头像、请移步到下面:里面有详细的获取微信好友头像的说明。

用微信好友头像生成祝福文字,你就是朋友圈最靓的仔

准备中国地图轮廓素材

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

元旦C位出道,用微信好友头像拼个中国地图吧!

拼接图片墙

    我们用微信好友头像拼接成一张大的图片墙,如果你愿意也可以自己PS一下。

元旦C位出道,用微信好友头像拼个中国地图吧!

    不过我们这里用Python里面的 PIL 图片处理模块来操作,主要是将小图拼接成与地图轮廓图同等大小的背景图(图片墙):

代码如下:

def combine_pic(folder,unit_size):
    """用图片生成一张地图大小的照片墙
    """
    # 读取地图轮廓图
    img = Image.open("ChinaMap.png")

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

    #根据小格尺寸,计算大图可容纳小图数量
    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}")
        try:
            # 对素材图缩放至小格大小
            test = Image.open(f"{folder}/" + pic_list[i%total]).resize((unit_size,unit_size), Image.ANTIALIAS)
        except IOError:
            print("图片读取失败,跳过该图片")  # 图片会读取失败
            continue

        #将缩放成小格的素材图按顺序贴到白色底图上
        new_img.paste(test,(x*unit_size,y*unit_size))
        x+=1
        if x==x_index:
            x=0
            y+=1

    print("照片墙合成完毕")
    #保存照片墙
    new_img.save("PhotoWall.jpg",quality=100)
    paste_map() #调用地图合成函数      

地图轮廓贴图

    到目前为止我们就有了2张图片,一张透明的中国地图,以及一张用微信好友头像拼接的图片墙。

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

def paste_map():
    """用透明地图覆盖头像图片
    """
    #读取合成后的素材图
    src1 = Image.open("PhotoWall.jpg")

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

    src1.paste(src2,(0,0),src2)

    savename = "result{}.png".format(unit_size)
    src1.save(savename)
    print("头像地图制作完毕!")
    os.system('pause')  #手动退出提示      
元旦C位出道,用微信好友头像拼个中国地图吧!

整体流程只需要4个步骤;

  • 准备好图片(微信好友头像)
  • 用图片生成一张图片墙
  • 准备一张透明的地图
  • 将图片墙和地图整合

完整代码:

https://github.com/huaisha1224/Python-Example      

注意事项

  • 由于图片墙和地图黏合时多出来的部分会被透明处理,所以会看不到
  • 生成图片墙的时候请根据头像数量多尝试小图大小