生成图片格式日历的Python程序

部署运行你感兴趣的模型镜像

在这里插入图片描述
可以将文本嵌入到背景图片中生成日历图片。以下是实现的基本步骤:

需要准备日历文本,如何生成文本格式的日历,参见【生成文本格式日历的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}")
  • 输出提示,告知用户生成的图片保存路径。

关键点说明

  1. 对齐方法

    • 使用等宽字体(如 DejaVuSansMono-Bold.ttf),每个字符宽度一致,方便文本对齐。
    • 通过手动调整空格数量,使得第一行的日期与标题对齐。
  2. 多行文本绘制

    • 使用 multiline_text() 方法直接绘制多行文本,避免逐行计算坐标,提高效率。
  3. 颜色与背景搭配

    • 白色文字((255, 255, 255))在烟花背景上有很好的可见性。
  4. 通用性

    • 程序可扩展为添加多个月份的日历,只需调整文本内容(calendar_text_aligned)。

输出示例

生成的图片中包含以下内容:

  • 背景是用户提供的烟花图片。
  • 左上角显示 对齐良好的 January 2025 日历
  • 文本为白色,清晰可读。

您可能感兴趣的与本文相关的镜像

FLUX.1-dev

FLUX.1-dev

图片生成
FLUX

FLUX.1-dev 是一个由 Black Forest Labs 创立的开源 AI 图像生成模型版本,它以其高质量和类似照片的真实感而闻名,并且比其他模型更有效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值