zoukankan      html  css  js  c++  java
  • 赶在520之前,程序员如何用Python送上最特别的“我爱你”表白

    摘要:每到情人节、七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。今天给大家分享一个独特的表白方法——我爱你拼出心爱人的模样!

    每到情人节、七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。

    你说送花吧,到时候朋友圈里一划,全部都是送花的,女票:没创意!,遂卒;

    你说送礼物吧,要是送的礼物不合心意,女票:你根本不懂我!,又卒;

    你说逛街买买买吧,摸摸空空的口袋,默默把这个想法丢到一边...

    今天,就和大家分享一个独特的表白方法——我爱你拼出心爱人的模样!

    成品图!

    什么?看不清长啥样?放大来康康

    (满眼都是爱你的形状~

    想做出这样的照片吗?那么~我们现在就开始啦~


    1. 需要准备的有

    女票超级无敌可爱美腻的照片 1张!

    python (这里用的是python3.7

    需要的用到的库

    cv2:用来读取照片

    PIL:用来生成新的图片

    性能比较OK的电脑

    (如果没有接触过python,不想/不会配环境、装cv2PIL之类的库,或者电脑性能不太够,强烈推荐使用华为云的ModelArts进行开发~直接解决环境配置、电脑性能的各种问题~

    2. 基本思路

    要实现这样的效果,首先需要有一张照片,提取其像素信息,然后赋给排布满文字的新图片,就能得到如上图所示的一张新图片啦!

    废话不多说,接下来就开始吧~

    3.操作流程

    1.首先导入用到的库(两者的作用在1中已有介绍)

    import cv2
    from PIL import Image, ImageDraw, ImageFont

    2.然后开始声明绘图的方法

    这里有两个参数,分别是原图片的路径和要写的文字

    def draw(pic, draw_text):

    3.接着读取图片

    使用cv2中的imread方法读取图片信息,

    使用PIL中的Image方法创建一个新的图片,其尺寸和源图片一致,背景为白色 

     img = cv2.imread(pic)    
    
      blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
    
      drawObj = ImageDraw.Draw(blank) # 告诉程序,我们接下来就要在这个图上写字啦!

    4.声明绘图的一些参数(这些参数都是我经过多次试验得到的最佳大小~

      n = 10 # 读取像素的间隔
    
      m = 9 # 字体的大小
    
      font_path = '你使用字体的位置' # 字体的路径
    
    
    
      font = ImageFont.truetype(font_path, size=m) # 将字体信息赋给font变量,供后续使用

    5.接下来就是最关键的一步!把文字写上去,并按照源图片给图片上色

    通过两个for循环,依次定位到每个文字所在的色块(中间间隔n是因为文字比像素块大得多,不可能完全按照每个像素的位置和色彩来排布)

    使用text()方法填入带色彩的文字,几个参数分别代表:

    [j, i] -- 坐标位置

    draw_text[int(j / n) % len(draw_text)] -- 找到当前该写入哪个文字了(比如我爱你中的第几个字)

    fill=(img[i][j][2], img[i][j][1], img[i][j][0]) -- 代表源图片对应位置的颜色(三个分别代表RBG颜色值)

    font -- 显然就是字体信息啦~

      for i in range(0, img.shape[0], n):    
    
          for j in range(0, img.shape[1], n):
    
            drawObj.text(
    
                      [j, i],
    
                draw_text[int(j / n) % len(draw_text)],
    
                fill=(img[i][j][2], img[i][j][1], img[i][j][0]),
    
                font=font
    
                ) # 按句子的顺序填充文字

    6.写入完成,导出图片

        blank.save('img_' + pic) # 保存生成的图片

    7.调用我们封装好的方法~

    输入图片路径和目标文字,运行~一张独一无二的表白图就大功告成!

    draw('1.jpg', "我爱你")

    附上全代码(记得把字体路径改成自己电脑的哟~

    import cv2
    
    from PIL import Image, ImageDraw, ImageFont
    
    
    
    
    
    def draw(pic, draw_text):
    
        img = cv2.imread(pic)
    
        blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
    
        drawObj = ImageDraw.Draw(blank)
    
    
    
        n = 10
    
        m = 9
    
    
    
        font = ImageFont.truetype(font_path, size=m)
    
    
    
        for i in range(0, img.shape[0], n):
    
            for j in range(0, img.shape[1], n):
    
                drawObj.text(
    
                            [j, i],
    
                            draw_text[int(j / n) % len(draw_text)],
    
                            fill=(img[i][j][2], img[i][j][1], img[i][j][0]),
    
                            font=font
    
                            )
    
    
    
        blank.save('img_' + pic)
    
    
    
        
    
    draw('1.jpg', "我爱你")

     


    进阶~

    既然都能做成一帧一帧的图片了,为什么不把他们连接起来~做成一个表白视频呢?

    当然阔以!

    具体实现的方法和代码都在这里:【2020华为云AI实战营】520到了!亲手给TA做一个独一无二的表白视频吧~

    点击这里,了解更多精彩内容

  • 相关阅读:
    [HDU 3038] How Many Answers Are Wrong
    [BZOJ 4977][Lydsy1708月赛]跳伞求生
    [BZOJ4974] 字符串大师
    总结-exCRT
    [luogu 4777] exCRT
    [AHOI 2009] 中国象棋
    JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
    十一黄金周 加班加点随笔
    从两个设计模式到前端MVC-洪宇
    Todo&Rocket
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13164744.html
Copyright © 2011-2022 走看看