
可以将文本嵌入到背景图片中生成日历图片。以下是实现的基本步骤:
需要准备日历文本,如何生成文本格式的日历,参见【生成文本格式日历的Python程序】
链接:https://blog.youkuaiyun.com/maply/article/details/144863560
实现步骤
准备背景图片:
选择一张适合做日历的背景图片,例如具有空白区域的烟花图案。
嵌入文本:
使用 Python 的 Pillow 库在图片上绘制文字。
设置合适的字体、颜色和位置,确保日期与背景图片搭配得当。
标题保存结果:
将生成的图片保存为新的日历图片文件。
Python代码:
from PIL import Image, ImageDraw, ImageFont
# 文件路径
image_path = "src/tmp/image.webp"
output_path = "src/tmp/2.jpg"
# 打开图片
background = Image.open(image_path).convert("RGB")
# 手动调整对齐的日历文本
calendar_text_aligned = """
January 2025
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
"""
# 调整图片大小(可选)
# background = background.resize((1024, 1024))
# 初始化绘图上下文
draw = ImageDraw.Draw(background)
# 设置字体和大小
try:
font = ImageFont.truetype(
"/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf", 36
) # 使用等宽字体
except IOError:
font = ImageFont.load_default()
# 文本位置和颜色
text_position = (50, 50) # 文本起始位置
text_color = (255, 255, 255) # 白色
# 将文本绘制到图片上
draw.multiline_text(
text_position, calendar_text_aligned, fill=text_color, font=font, spacing=4
)
# 保存生成的图片
background.save(output_path)
# 输出生成的图片路径
print(f"生成的图片保存为: {output_path}")
生成对齐良好的日历图片的代码解析
功能概述
这段代码实现了在一张背景图片上绘制一个对齐良好的日历。日历文本以 固定宽度对齐,通过 Pillow 库将文本绘制在图片上,最终生成一张包含日历的图片。
代码分段解析
1. 导入必要模块
from PIL import Image, ImageDraw, ImageFont
Pillow是一个强大的 Python 图像处理库。Image用于加载和处理图像文件。ImageDraw提供在图片上绘制文本和图形的工具。ImageFont用于加载和设置字体。
2. 文件路径设置
image_path = "src/tmp/image.webp"
output_path = "src/tmp/calendar.jpg"
image_path:指向背景图片的路径(用户上传的烟花背景图片)。output_path:指定输出图片保存的路径。
3. 加载背景图片
background = Image.open(image_path).convert("RGB")
Image.open():加载背景图片。.convert("RGB"):确保图片为 RGB 模式,便于处理颜色。
4. 手动调整对齐的日历文本
calendar_text_aligned = """
January 2025
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
"""
- 使用 手动调整 的方式使日历文本与星期标题对齐。
- 第一行(
1, 2, 3, 4)的日期位置根据空格进行微调,确保与标题(Sun, Mon)对齐。 - 每个数字占用固定宽度,单个数字前加空格确保对齐。
- 第一行(
5. 调整图片大小(可选)
background = background.resize((1024, 1024))
- 将图片调整为
1024x1024的尺寸,确保适合绘制文本。 - 可根据需要修改尺寸。
6. 初始化绘图上下文
draw = ImageDraw.Draw(background)
ImageDraw.Draw():初始化绘图工具,使得可以在图片上添加文字或绘制图形。
7. 设置字体和大小
try:
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf", 24)
except IOError:
font = ImageFont.load_default()
ImageFont.truetype():- 加载系统中的等宽字体(
DejaVuSansMono-Bold.ttf),这种字体保证所有字符宽度一致,适合对齐文字。
- 加载系统中的等宽字体(
ImageFont.load_default():- 如果无法加载字体,则使用默认字体,但对齐效果可能不如等宽字体。
8. 设置文本位置和颜色
text_position = (50, 50) # 文本起始位置
text_color = (255, 255, 255) # 白色文字
text_position:定义文本在图片上的起始位置,单位为像素。(50, 50)指在左上角偏移 50 像素的位置开始绘制文字。text_color:设置文本颜色为白色。
9. 绘制文本到图片上
draw.multiline_text(text_position, calendar_text_aligned, fill=text_color, font=font, spacing=4)
draw.multiline_text():- 在图片上绘制多行文本。
- 参数说明:
text_position:文本的起始位置。calendar_text_aligned:要绘制的日历文本。fill:文本颜色。font:字体和大小。spacing:行间距,设置为 4 像素,确保行间不拥挤。
10. 保存生成的图片
background.save(output_path)
background.save():将绘制好的图片保存到指定路径。
11. 输出生成的图片路径
print(f"生成的图片保存为: {output_path}")
- 输出提示,告知用户生成的图片保存路径。
关键点说明
-
对齐方法:
- 使用等宽字体(如
DejaVuSansMono-Bold.ttf),每个字符宽度一致,方便文本对齐。 - 通过手动调整空格数量,使得第一行的日期与标题对齐。
- 使用等宽字体(如
-
多行文本绘制:
- 使用
multiline_text()方法直接绘制多行文本,避免逐行计算坐标,提高效率。
- 使用
-
颜色与背景搭配:
- 白色文字(
(255, 255, 255))在烟花背景上有很好的可见性。
- 白色文字(
-
通用性:
- 程序可扩展为添加多个月份的日历,只需调整文本内容(
calendar_text_aligned)。
- 程序可扩展为添加多个月份的日历,只需调整文本内容(
输出示例
生成的图片中包含以下内容:
- 背景是用户提供的烟花图片。
- 左上角显示 对齐良好的 January 2025 日历。
- 文本为白色,清晰可读。
1083

被折叠的 条评论
为什么被折叠?



