最近的一周里,小编的朋友圈被大家刷屏了,大家都在@微信的官方,想让官方为大家的头像上插入一面国旗,为祖国的70大寿祝贺。
小编也凑热闹加入了大军,但是既然咱们会Python,为什么不自己做一个呢,于是小编今天也编写了一个简易的制作“贴画头像”的程序!
该程序不仅仅可以为大家制作不同的头像贴画,而且还可以为大家制作不同位置的头像贴画,例如你想将贴画放在头像的不同的角落里,程序都可以帮你实现。
话不多说,开始动手。
程序一共只有短短的30行代码,但是他实现的功能可是不少,部分程序如下图所示。
from scipy.misc import imread, imresize, imsave
import glob
def add_icon():
head_pic = imread('./pics/head.jpg')
icon_pic = imread('./pics/{}.jpg'.format(pic_name)) # 读取图标
# 获取头像和图标的长宽
head_w, head_h = head_pic.shape[:2]
icon_w, icon_h = icon_pic.shape[:2]
# 计算图案缩放比例
if icon_w > icon_h:
icon_pic = imresize(icon_pic, (head_w, int(icon_w/icon_h*head_h)))
else:
icon_pic = imresize(icon_pic, (head_h, int(icon_h/icon_w*head_w)))
print(icon_pic.shape)
# 缩放图案
icon_w, icon_h = icon_pic.shape[:2]
icon_pic = imresize(icon_pic, (int(icon_w/ 6), int(icon_h / 6)))
icon_w, icon_h = icon_pic.shape[:2]
print(icon_pic.shape[:2])
if postion_name == "topleft":
head_pic[:icon_w, :icon_h, :] = icon_pic[:, :] # 左上角
elif postion_name == "topright":
head_pic[-icon_w:, :icon_h, :] = icon_pic[:, :] # 右上角
elif postion_name == "bottomleft":
head_pic[:icon_w, -icon_h:, :] = icon_pic[:, :] # 左下角
else:
head_pic[-icon_w:, -icon_h:, :] = icon_pic[:, :] # 右下角
(代码左右滑动看)
上图程序中,我们首先选择输入要使用哪一种贴画;
然后输入我们要将贴画放置的位置,分别是左上角,左下角,右上角和右下角;
接着设置完成后,我们读入选择的贴画,然后根据贴画的长宽比例进行缩放,目的是为了贴画更加的自然美观;
记得我们调整贴画的尺寸为其大小的六分之一;
最后将其复制到我们的头像图画上,整个程序便得以顺利的完成;
下面我们给出的是成果的展示:
我们选择了四个不同的贴画,分别是两部新出的手机,还有大鸡腿以及五星红旗。至于设置的位置,小编统一的选择了左上角,大家如果觉得不喜欢的话,可以选择其他的角落进行放置。同样会有不错的效果。
建议大家修改一下文件的Path,加入下面两行,以方便运行代码:
上面的图标周围没有白边距,我们这次修改一些代码,加上20像素的留边,这样更好看一些。
if postion_name == "topleft":
head_pic[:icon_w+20, :icon_h+20, :] = np.ones_like(head_pic[:icon_w+20, :icon_h+20, :]) * 255
head_pic[10:icon_w+10, 10:icon_h+10, :] = icon_pic[:, :] # 左上角
elif postion_name == "topright":
head_pic[:icon_w + 20, -icon_h - 20:, :] = np.ones_like(head_pic[:icon_w + 20, -icon_h - 20:, :]) * 255
head_pic[10:icon_w + 10, -icon_h - 10:-10, :] = icon_pic[:, :] # 右上角
elif postion_name == "bottomleft":
head_pic[-icon_w - 20:, :icon_h + 20, :] = np.ones_like(head_pic[-icon_w - 20:, :icon_h + 20, :]) * 255
head_pic[-icon_w - 10:-10, 10:icon_h + 10, :] = icon_pic[:, :] # 左下角
else:
head_pic[-icon_w-20:, -icon_h-20:, :] = np.ones_like(head_pic[-icon_w-20:, -icon_h-20:, :]) * 255
head_pic[-icon_w-10:-10, -icon_h-10:-10, :] = icon_pic[:, :] # 右下角
plt.imshow(head_pic)
plt.show()
(代码左右滑动看)
我们以“topleft"为例:
-
上述的程序中,我们首先以图标的尺寸为基础,长和宽各扩充20个像素,填充为白色;
-
one_like函数的目的就是创造一个数值全部为1的矩阵,矩阵的大小为head_pic[:icon_w+20, :icon_h+20, :];
-
然后我们再将图标放置到白色的背景上去,图标距离白色背景的边缘为10个像素。
-
看一些效果:
以上的头像设置是不是感觉非常的不错呢,相比于微信官方给出的头像,我们的设计是不是显得更加的灵活呢,大家也赶快动手制作属于自己的头像吧,冲鸭!
后台输入:【国庆】,直接拿走全部源码和素材图片,拿走不谢!
往期热门: