• 【教师节特辑】做个教师节快乐照片墙吧


    写作原因:

            教师节到了,身边或多或少都有很多不少的老师,基本以前认识的老师都不记得了,以后总也会认识一些日本老师的。程序员,就应该以自己的方式来庆祝教师节。想了下,要不还是做个照片墙把。

    项目链接 airhandsome/wall-of-text: Use picture to compose text (github.com)

    写代码:

           这种代码肯定是用万能的python来处理,虽然以前使用的CV基本忘光了,不过python的好处就在于我们随时随地都能找到一些好用的库。既然是照片墙,具体肯定要分三个方面:

    1. 取照片

    这边用大家都很熟悉的合法工具request拿一些公开的图片,应该不算违规把。

    这边那我选取了百度贴吧的一个教师节快乐帖子,里面有二十几张图片,挺喜庆的,这时候只要解析到BDE_Image标签就能用了

    1. def getJPGs(url):
    2. # 获取url链接的内容
    3. html = requests.get(url)
    4. soup = BeautifulSoup(html, "html.parser")
    5. # 查找 class 为 BDE_Image 的图片标签
    6. image_tags = soup.find_all("img", class_="BDE_Image")
    7. # 提取图片链接
    8. image_urls = [img["src"] for img in image_tags]
    9. return image_urls
    10. #保存单张图片
    11. def downloadJPG(imgUrl, fileName):
    12. response = requests.get(imgUrl)
    13. with open(fileName, 'wb') as f:
    14. f.write(response.content)
    15. #保存图片列表
    16. def batchDownloadJPGs(imgUrls, path='pixels/'):
    17. if not os.path.exists(path):
    18. os.mkdir(path)
    19. count = 0
    20. for url in imgUrls:
    21. downloadJPG(url, ''.join([path, '{0}.jpg'.format(count)]))
    22. print('number: ' + str(count))
    23. count = count + 1
    24. if __name__ == "__main__":
    25. url = 'https://tieba.baidu.com/p/8594160102'
    26. jpgs = getJPGs(url)
    27. batchDownloadJPGs(jpgs)

    2. 拿底料

    什么是底料呢,就是这个照片墙要组成什么形状啊,比如我现在就是想组成文字,那就组呗,得整个Python库用一下

    1. def get_text_position(text):
    2. pygame.init()
    3. font_size = 30 # 字体大小pygame.init() # 模块的初始化 为什么 pygame不是我开发的, 我们用的别人 python语法 三原色
    4. font = pygame.font.Font('msyh.ttc', font_size)
    5. print(font) # 字体的渲染
    6. # True 锯齿化 rgb 颜色 由三原色组成 黑 白
    7. font_text = font.render(text, True, (0, 0, 0), (255, 255, 255))
    8. print(font_text) # 获取字体的宽高
    9. height = font_text.get_height() # 高度
    10. width = font_text.get_width() # 宽度
    11. print('height: ', height)
    12. print('width: ', width) # 根据什么逻辑贴图 像素点
    13. image_row_list = []
    14. #缩放程度,1就是原图大小,2就是缩小为原来的一半
    15. shrink_part = 1
    16. for x in range(height // shrink_part):
    17. image_col_list = []
    18. for y in range(width // shrink_part):
    19. val = 0
    20. for i in range(shrink_part):
    21. for j in range(shrink_part):
    22. x_index = x * shrink_part + i
    23. y_index = y * shrink_part + j
    24. val += font_text.get_at((y_index, x_index))[0]
    25. val //= shrink_part * shrink_part
    26. if val != 255: # 如果像素点不是白色
    27. image_col_list.append(1) # 黑色添加数据1
    28. else:
    29. image_col_list.append(0) # 白色添加数据0
    30. image_row_list.append(image_col_list)
    31. return list(image_row_list)

    这边的text就是填写你要的内容,比如说我要生成“教师节快乐”,参数就是“教师节快乐”

    3. 画图

    把第二步的结果直接传进来就能画了,实际上就是第二部的矩阵中为1的就随机放一张图片上去。最后保存好。

    1. def drawImage(image_list):
    2. width_len = len(image_list[0]) # 列表的宽
    3. height_len = len(image_list) # # 列表的高# 创建图片
    4. new_image = Image.new('RGB', (width_len * 100, height_len * 100), (255, 255, 255)) # 贴图
    5. img_size = 100 # 初始图片尺寸
    6. for row in range(height_len):
    7. for clo in range(width_len):
    8. if image_list[row][clo] == 1: # 如过列表的值为1, 就贴图# 读取图片
    9. source_image = Image.open('pixels/' + random.choice(os.listdir(r'pixels')))# 修改图片的大小
    10. source_image = source_image.resize((img_size, img_size), Image.LANCZOS)# 将图片复制到new_image
    11. new_image.paste(source_image, (clo * img_size, row * img_size))# 照片强保存
    12. print('正在生成照片墙...')
    13. new_image.save('output.png')
    14. print('保存完毕, 请在当前文件项目下查找')

    效果

    无缩放的图片,大概14M吧

    wall-of-text/output_1.png at main · airhandsome/wall-of-text (github.com)icon-default.png?t=N7T8https://github.com/airhandsome/wall-of-text/blob/main/output_1.png

    设置了shrink_part = 2的图片,大概 6M,其实就是每2*2的像素合并成为1个像素,所以看起来会比较粗糙,但是因为微信发送的话会压缩,就没有效果了,所以粗糙点可能好点。

    wall-of-text/output.png at main · airhandsome/wall-of-text (github.com)icon-default.png?t=N7T8https://github.com/airhandsome/wall-of-text/blob/main/output.png

  • 相关阅读:
    Redis布隆过滤器
    Java安全 CC链3分析
    【20220903-美团笔试】
    【秋招面经】菜鸟前端题目总结
    前端+elementui
    【vue2中的pdf预览】iframe/pdf.js/vue-pdf
    【leetcode】值和下标之差都在给定的范围内
    HTML基础笔记
    建筑行业:别再做人工巡检了!教你一个小技巧
    Redis趋势—NVM内存
  • 原文地址:https://blog.csdn.net/u013379032/article/details/132797646