脚本记录:csdn文章封面图片的简易制作

仅供个人使用,如有问题可私信或评论区留言


存在意义

  在csdn上发布文章的时候,需要上传封面图片,可系统自带图片不好看,而且还不能自定义文字,如果从其他地方随便找个好看的封图,会发现,图片长宽比的不适配的原因导致不能很好的自适应!即图片部分内容会被减裁掉,于是我在经过一番了解后,写了一个脚本程序,使之能够根据程序中嵌入的背景图片,以及用户输入的文本,给出一个480*270像素的png图片。这样就可以拥有一个好看的文章封面图片啦q(≧▽≦q)!!!


源码叙述

  其中有两处路径需要更改,在22-25行,变量名为font_pathtexture_path,前者为字体库路径(即插入图片中的字体类型),后者为背景图片路径。字体库可用电脑自带ttf文件,或者是网上找喜欢的(我找的字体库网站分享在最下方链接中)。两者均需用绝对路径。

import os
from PIL import Image, ImageDraw, ImageFont


def create_image(content, save_path):
    """
    使用预定义的字体和大小,创建一个图像,并将指定的文本内容居中显示。当文本宽度大于图片宽度时,
    自动计算出合适的字体大小以适应图片宽度。当文本宽度小于图片宽度时,字体大小保持为96。
    此外,文本将具有50%透明度的红色边缘阴影效果。

    参数:
    - content (str): 要写入图像的文本内容。支持通过 '\n' 分隔的多行文本。
    - save_path (str): 生成的图像将被保存到的文件路径。

    该函数不返回任何值,但会将生成的图像保存到指定路径。
    """
    image_width = 480
    image_height = 270
    lines = content.split("\n")  # 将输入文本分割成行

    initial_font_size = 96  # 初始字体大小
    font_path = (
        "C:/Users/29173/AppData/Local/Microsoft/Windows/Fonts/ZiZiMuTiv1.002-2.ttf"
    )
    texture_path = "D:/vscode_workspace/python310/csdn_home_img_create/resource/175534490_0_final.png"  # 纹理图像文件的路径
    texture_image = Image.open(texture_path).resize(
        (image_width, image_height)
    )  # 加载背景图像并调整其大小以适应要求的图像大小
    image = texture_image.convert("RGBA")  # 确保图像是RGBA模式以支持透明度
    draw = ImageDraw.Draw(image)

    shadow_offset = (3, 3)  # 阴影偏移量
    shadow_color = (255, 0, 0, 128)  # 带有50%透明度的红色阴影

    # 绘制文本
    for line in lines:
        font_size = initial_font_size
        font = ImageFont.truetype(font_path, font_size)  # 创建字体对象
        # 使用getbbox获取文本的边界框
        left, top, right, bottom = draw.textbbox((0, 0), line, font=font)
        text_width = right - left
        text_height = bottom - top

        # 当文本宽度大于图片宽度时,自动调整字体大小,直到文本宽度小于等于图片宽度为止
        while text_width > image_width and font_size > 1:
            font_size -= 1
            font = ImageFont.truetype(font_path, font_size)
            # 使用getbbox获取文本的边界框
            left, top, right, bottom = draw.textbbox((0, 0), line, font=font)
            text_width = right - left
            text_height = bottom - top

        # 将文本居中显示在图片上
        x_text = (image_width - text_width) / 2 - left
        total_text_height = len(lines) * (text_height + 5) - 5  # 计算文本总高度
        y_text = (image_height - total_text_height) / 2 - top

        # 首先绘制阴影文本
        draw.text(
            (x_text + shadow_offset[0], y_text + shadow_offset[1]),
            line,
            shadow_color,
            font=font,
        )
        # 然后在上面绘制原始文本
        draw.text(
            (x_text, y_text), line, fill=(0, 0, 0, 255), font=font
        )  # 确保文本不透明
        y_text += text_height + 5

    image.save(save_path)


def path_rectify(save_path):
    """
    校正提供的保存路径,确保其为有效的图像文件路径。如果路径是一个目录,则在该目录下创建以文本内容命名的.png文件。
    如果路径不是目录,根据路径是否包含文件扩展名来进行处理:如果没有扩展名,将路径视为目录,并在其中创建.png文件;
    如果有扩展名但不是.png,将.png添加到现有路径末尾。此外,如果路径中的中间目录不存在,则会创建这些目录。
    """

    if not save_path:  # 检测save_path是否为空
        save_path = os.path.join(os.getcwd(), f"{text}.png")
    elif os.path.isdir(save_path):  # 检测save_path是否指向一个已存在的目录
        save_path = os.path.join(save_path, f"{text}.png")
    else:
        # 如果save_path不是目录,检查是否已经有文件名
        base, ext = os.path.splitext(save_path)
        # 调整目录,以更好检查中间级目录
        if not ext:
            directory = base
        else:
            directory = os.path.dirname(save_path)

        if not ext:
            # 如果没有文件扩展名,使用文本作为文件名并保持.png扩展名
            if not os.path.exists(directory):  # 检查中间级目录是否存在
                os.makedirs(directory)  # 创建中间级目录
            save_path = os.path.join(directory, f"{text}.png")
        else:
            # 如果有文件扩展名
            if ext.lower() != ".png":
                # 如果文件扩展名不是.png,添加.png扩展名
                save_path += ".png"
            if not os.path.exists(directory):  # 检查中间级目录是否存在
                os.makedirs(directory)  # 创建中间级目录

    return save_path


if __name__ == "__main__":
    # 提示用户输入文本
    text = input("请加入文本内容:")

    # 保存的文件名为文本内容,默认保存路径为当前路径
    save_path = input(
        f"请加入图像生成存储路径(直接回车则默认是当前路径, 默认文件名是输入的文本): "
    ).strip()

    # 校正保存路径,确保其为有效的图像文件路径
    save_path = path_rectify(save_path)

    create_image(text, save_path)
    print(f"图片已保存到:{save_path}")


使用方法

  第一步:
  确保具有python基本开发环境和pillow库,通过终端输入python --version来检查python版本,输入pip show pillow来检查pillow库版本。

  成功示例:
在这里插入图片描述

  第二步:
  创建main.py来存放上述源码,找到一张喜欢的背景图片,ttf字体库看个人选择,可默认选择电脑自带ttf文件(一般电脑ttf文件存放默认路径在"C:\Windows\Fonts"),更改font_pathtexture_path路径为文件所在位置,源码中有我的示例路径。

  成功示例: 我创建的文件夹示例
在这里插入图片描述

  第三步:
  终端执行python .\main.py运行脚本代码,正常运行情况下跟随提示输入相应信息即可。
在这里插入图片描述
  你会发现执行路径对应的目录下会多出一个图片,该图片即为合成后的图片。
在这里插入图片描述

  成功示例: 效果图
在这里插入图片描述


相关信息

  python3.10、pillow10.3.0


链接:

  https://www.fonts.net.cn/
  描述:一个可以提供ttf字体库的网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值