520这天!分享用Python准备好的礼物

发表于:2021-5-20 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yunyun云芸    来源:CSDN

  每到母亲节、情人节、七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。就比如即将到来的520,小编就打算准备这样一个小惊喜送给我的单身朋友,要他体验下520的仪式感,不管是自己女朋友还是亲人朋友,都希望节日能有仪式感,今天小编给大家分享一个独特的方法——用“我爱你”拼出你心爱人的模样!
  一年对于女生来说只要他愿意,他的每一天都能是节日,节日你们数不清,植树节、情人节、母亲节、愚人节、妇女节、除夕、儿童节、万圣节、生日~
  你说送花吧,到时候朋友圈里一划,全部都是送花的,女票:“没创意!”,遂卒;
  你说送口红吧,到时候你挑的觉得颜色好看,女票:“你不懂我!”,卒;
  你说送礼物吧,要是送的礼物不合心意,女票:“你根本不懂我!”,又卒;
  你说逛街买买买吧,摸摸空空的口袋,默默把这个想法丢到一边…
  今天,就和大家分享一个独特的表白方法——用“我爱你”拼出心爱人的模样!不管是送女票还是亲人朋友,都是很有创意惊喜的!
  这是从网上随便找的图,用来做个例子:
  这是成品图!
  你说什么?“我爱你”在哪里,看不清长啥样?放大来康康,将讲讲~
  想做出这样的照片吗?那么我们现在就开始啦~
  一. 需要准备的有
  女票\朋友超级无敌可爱美腻的照片 1张!
  python:这里用的是python3.7)
  需要的用到的库:
  cv2:用来读取照片
  PIL:用来生成新的图片
  性能比较OK的电脑
  (如果没有接触过python,不想/不会配环境、装cv2、PIL之类的库,或者电脑性能不太够,强烈推荐使用华为云的ModelArts进行开发,直接解决环境配置、电脑性能的各种问题~)
  二. 基本思路
  要实现这样的效果,首先需要有一张照片,提取其像素信息,然后赋给排布满文字的新图片,就能得到如上图所示的一张新图片啦!
  废话不多说,接下来就开始吧~
  三.操作流程
  1.首先导入用到的库(两者的作用在1中已有介绍)
  from PIL import Image, ImageDraw, ImageFont
  2.然后开始声明绘图的方法
  这里有两个参数,分别是原图片的路径和要写的文字:
  def draw(pic, draw_text):
  3.接着读取图片
  使用cv2中的imread方法读取图片信息;
  使用PIL中的Image方法创建一个新的图片,其尺寸和源图片一致,背景为白色。
  blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
  drawObj = ImageDraw.Draw(blank) # 告诉程序,我们接下来就要在这个图上写字啦!
  4.声明绘图的一些参数(这些参数都是我经过多次试验得到的最佳大小~)
  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颜色值)。
  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.写入完成,导出图片
  7.调用我们封装好的方法~
  输入图片路径和目标文字,运行~一张独一无二的表白图就大功告成!
  draw(‘1.jpg’, “我爱你”)
  附上全代码:
  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', "我爱你")

   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号