系列文章目录
前言
一、心形照片墙
效果图片:
1.源码
代码如下(示例):
from PIL import Image
import os
import math
map = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
# 这个是我图片的所在路径
img_dir = r"E:\py\python3.7\test\test57zidingyitupianqiang\photo\lolimage"
# 获取这个文件下的所有文件,因为没有过滤其他类型文件,所以不要放非图片文件
# 返回的是一个列表
imgs = os.listdir(img_dir)
# 设置图片的尺寸,所有图片尺寸要保持统一,要有组织有纪律
img_h = img_w = 192
# 计算行数,即子列表的个数
rows = len(map)
# 计算列数,即子列表中元素的个数
columns = len(map[0])
# 第一个参数照着写
# 第二个参数需要传入一个元组,元组的第一个参数是画布的宽,第二个是高
# 第三个参数传入的是画布的颜色
# 使用Image.new()方法创建一个画布
figure = Image.new("RGB", (img_w*columns, img_h*rows),"white")
# 表示图片的下标
count = 0
# 遍历行
for i in range(len(map)):
# 遍历每行中的所有元素
for j in range(len(map[i])):
# 如果元素是1,就不管它
if map[i][j] == 1:
continue
# 如果元素是非1,即0就放图片上去
else:
# 做个异常处理,防止有些图片打开失败,导致程序中断
try:
# 使用Image.open("图片路径")方法获取图片对象
image = Image.open(os.path.join(img_dir, imgs[count]))
except:
continue
# resize((新的宽,新的高))用来改变图片的尺寸,接收一个元组
image = image.resize((img_w, img_h))
# 将修改尺寸后的图片(image)粘贴(paste)到画布(figure)上
# 第一个参数 是图片对象
# 第二个参数是 图片在画布上的位置,相当于单元格的位置
figure.paste(image, (img_w*j, img_h*i))
# 使用完一张图片就要记录下来,并开始使用下一张图片
count += 1
# 当循环结束,即表示心型照片图已经完成
# 将画好的画布显示出来,给你看到
figure.show()
# 不满意在调整二维数组中0的位置,满意可以保存到本地,用来装逼
# 需要告知程序图片保存的路径
figure.save('心型照片墙.png')
二、自定义文字map
1.源码
代码如下(示例):
import pygame # 游戏模块,字体功能, 第三方模块 pip install pygame
from PIL import Image # 图像处理模块, pip install pillow
import os # 目录操作, 内置
import random # 随机数模块, 随机取一张图片
text = '前程似锦!'
font_size = 30 # 字体大小
pygame.init() # 模块的初始化 为什么 pygame不是我开发的, 我们用的别人 python语法 三原色
#font = pygame.font.Font('msyh.ttc', font_size)
font = pygame.font.Font('C:/Windows/fonts/华文行楷.ttc', font_size)
print(font)
# 字体的渲染
# True 锯齿化 rgb 颜色 由三原色组成 黑 白
font_text = font.render(text, True, (0, 0, 0), (255, 255, 255))
print(font_text)
# 获取字体的宽高
height = font_text.get_height() # 高度
width = font_text.get_width() # 宽度
print('height: ', height)
print('width: ', width)
# 根据什么逻辑贴图 像素点
print(font_text.get_at((1, 1))[0])
# 根据像素点做分类: 划分为一个二维列表
image_row_list = []
for x in range(height):
image_col_list = [] #
for y in range(width):
if font_text.get_at((y, x))[0] != 255: # 如果像素点不是白色
image_col_list.append(1) # 黑色添加数据1
else:
image_col_list.append(0) # 白色添加数据0
image_row_list.append(image_col_list)
for row in image_row_list:
print(row)
# 贴图 照片墙
width_len = len(image_row_list[0]) # 列表的宽
height_len = len(image_row_list) # # 列表的高
# 创建图片
new_image = Image.new('RGB', (width_len * 100, height_len * 100), (255, 255, 255))
# 贴图
img_size = 100 # 初始图片尺寸
for row in range(height_len):
for clo in range(width_len):
if image_row_list[row][clo] == 1: # 如过列表的值为1, 就贴图
# 读取图片
source_image = Image.open('lolimage\\' + random.choice(os.listdir(r'lolimage')))
# 修改图片的大小
source_image = source_image.resize((img_size, img_size), Image.ANTIALIAS)
# 将图片复制到new_image
new_image.paste(source_image, (clo * img_size, row * img_size))
# 照片强保存
print('正在生成照片墙...')
new_image.save(text + '.png')
print('保存完毕, 请在当前文件项目下查找')
总结
分享:
Make yourself a better person and know who you are before you try and know someone else and expect them to know you. 在你想了解别人也想让别人了解你之前,先完善并了解自己。–(莎士比亚)