如何使用Python和PIL库生成带竖排文字的封面图像

news2024/12/28 23:10:20

在今天的博客中,我们将学习如何使用Python和PIL(Pillow)库生成一个简单而有创意的封面图像。我们将创建一个背景图像,并在其上绘制带有竖排文字的标题和副标题,最后再添加一些装饰性元素如星星和萤火虫。这个教程适合初学者,特别是对于那些想了解如何操作图像、使用字体和进行基本图形设计的朋友们。

目标

  1. 生成一个背景图像(例如:goddess.png)。
  2. 在图像上绘制带有竖排文字的标题和副标题。
  3. 添加一些简单的装饰性图形(如星星和萤火虫)。
  4. 最终保存并展示生成的封面图像。

环境准备

首先,确保你已经安装了必要的Python库。你可以使用以下命令安装Pillow库,它是Python Imaging Library(PIL)的一个分支:

pip install pillow

如果你想使用自定义字体(如书法字体),你还需要确保在系统中有合适的字体文件。例如,FangzhengKaiTi.ttf 是一种常见的字体文件,你可以根据自己的需求选择合适的字体。

实现步骤

下面是我们整个程序的代码实现,逐步讲解各部分内容。

1. 导入必要的库

from PIL import Image, ImageDraw, ImageFont
import random

我们使用Pillow库来处理图像。Image 用于打开和处理图片,ImageDraw 用于在图像上绘制文字和图形,ImageFont 用于加载字体,random 用于生成随机的装饰图形(如星星和萤火虫)。

2. 创建封面背景

在我们的代码中,我们将使用一个名为 goddess.png 的图片作为封面的背景。这张图片将被调整为合适的尺寸(800x1200),你可以根据自己的需求替换为任意其他图片。

# 创建封面背景
def create_cover():
    try:
        background_image = Image.open('goddess.png')  # 加载背景图
        if background_image.mode != 'RGBA':
            background_image = background_image.convert('RGBA')
        background_image = background_image.resize((800, 1200))
    except IOError:
        print("无法加载背景图片,请确保路径正确。")
        return
    img = background_image.copy()
    draw = ImageDraw.Draw(img)

3. 加载字体

我们使用一个古代书法风格的字体(例如 FangzhengKaiTi.ttf),并将其应用于标题和副标题文字。如果字体加载失败,则使用默认字体。

    try:
        font_title = ImageFont.truetype("FangzhengKaiTi.ttf", 70)
        font_subtitle = ImageFont.truetype("FangzhengKaiTi.ttf", 50)
    except IOError:
        font_title = ImageFont.load_default()
        font_subtitle = ImageFont.load_default()

4. 绘制竖排文字

我们需要将标题和副标题文字绘制为竖排格式。我们将每个字符的位置向下移动,以确保字符在竖直方向上不重叠。

    title_text = "飞火萤天"
    subtitle_text = "一个关于爱与希望的传说"

    bright_color = (255, 255, 102)  # 明亮的黄色

    # 竖排绘制标题文字,标题位置偏移
    x = 180  # 调整 x 坐标,使标题更靠左
    y = 70   # 调整 y 坐标,使标题更靠下
    for char in title_text:
        draw.text((x, y), char, font=font_title, fill=bright_color)
        bbox = draw.textbbox((x, y), char, font=font_title)
        char_height = bbox[3] - bbox[1]
        y += char_height

    # 竖排绘制副标题文字,副标题位置偏移
    x = 180  # 调整 x 坐标,使副标题更靠左
    y = 270  # 调整 y 坐标,使副标题更靠下
    for char in subtitle_text:
        draw.text((x, y), char, font=font_subtitle, fill=bright_color)
        bbox = draw.textbbox((x, y), char, font=font_subtitle)
        char_height = bbox[3] - bbox[1]
        y += char_height

在这个部分,我们使用 draw.text() 来绘制每个字符,并通过调整 y 坐标来实现竖排效果。为了避免字符重叠,我们还根据字符的高度动态调整 y 坐标。

5. 添加装饰元素

为了让封面更加生动,我们可以随机生成一些星星和萤火虫来装饰封面。这些装饰物将使用椭圆形状进行绘制,并且它们的位置和大小会有所随机化。

    for _ in range(20):
        x = random.randint(50, img.width - 50)
        y = random.randint(50, img.height - 50)
        radius = random.randint(3, 6)
        draw.ellipse([x - radius, y - radius, x + radius, y + radius], fill=(255, 223, 186), outline=(255, 223, 186))

6. 保存并显示封面图像

最后,我们将生成的封面图像保存为 飞火萤天封面.png,并使用 img.show() 展示出来。

    img.save("飞火萤天封面.png")
    img.show()

7. 完整代码

以下是完整的代码:

from PIL import Image, ImageDraw, ImageFont
import random

def create_cover():
    try:
        background_image = Image.open('goddess.png')  # 加载背景图
        if background_image.mode != 'RGBA':
            background_image = background_image.convert('RGBA')
        background_image = background_image.resize((800, 1200))
    except IOError:
        print("无法加载背景图片,请确保路径正确。")
        return
    img = background_image.copy()
    draw = ImageDraw.Draw(img)

    try:
        font_title = ImageFont.truetype("FangzhengKaiTi.ttf", 70)
        font_subtitle = ImageFont.truetype("FangzhengKaiTi.ttf", 50)
    except IOError:
        font_title = ImageFont.load_default()
        font_subtitle = ImageFont.load_default()

    title_text = "飞火萤天"
    subtitle_text = "一个关于爱与希望的传说"
    bright_color = (255, 255, 102)

    x = 180
    y = 70
    for char in title_text:
        draw.text((x, y), char, font=font_title, fill=bright_color)
        bbox = draw.textbbox((x, y), char, font=font_title)
        char_height = bbox[3] - bbox[1]
        y += char_height

    x = 180
    y = 270
    for char in subtitle_text:
        draw.text((x, y), char, font=font_subtitle, fill=bright_color)
        bbox = draw.textbbox((x, y), char, font=font_subtitle)
        char_height = bbox[3] - bbox[1]
        y += char_height

    for _ in range(20):
        x = random.randint(50, img.width - 50)
        y = random.randint(50, img.height - 50)
        radius = random.randint(3, 6)
        draw.ellipse([x - radius, y - radius, x + radius, y + radius], fill=(255, 223, 186), outline=(255, 223, 186))

    img.save("飞火萤天封面.png")
    img.show()

create_cover()

总结

通过使用Python的Pillow库,我们成功地创建了一个带有竖排文字、装饰元素和自定义字体的封面图像。这种技术可以用在许多不同的应用场景中,如制作电子书封面、社交媒体封面图等。你可以根据自己的需求调整字体、文字内容和图形设计,创造出个性化的封面。

希望你能通过这个教程掌握一些基本的图像处理技巧,进一步探索更多的创意设计。如果有任何问题或改进建议,欢迎在评论区留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐(第九期)一、【tldraw】,37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】,9.1k stars - 独立(无需第三方服务器)DPI 规避工具三、【uBlock】,48.3k s…

学习threejs,THREE.PlaneGeometry 二维平面几何体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️HREE.PlaneGeometry 二维平…

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…

面向对象的设计原则与设计模式

目的 设计模式的目的是提高代码的重用性,可读性、可扩展性、可靠性,使程序呈现高内聚,低耦合的特性 原则 单一职责原则 假设有一个class负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能…

网络安全词云图与技术浅谈

网络安全词云图与技术浅谈 一、网络安全词云图生成 为了直观地展示网络安全领域的关键术语,我们可以通过词云图(Word Cloud)的形式来呈现。词云图是一种数据可视化工具,它通过字体大小和颜色的差异来突出显示文本中出现频率较高…

Jsonlizer,一个把C++各类数据转成 Json 结构体的玩意儿

这段时间突发奇想,觉得可以弄一个Json和C各种数据类型互转的工具,因为Json在进行数据储存的时候,有一些先天的优势,传统的C的序列化方式是将数据序列化到流数据里面,而流数据是典型的串行结构(或则说是一维…

删除拼排序链表中的重复元素(最优解)

题目来源 82. 删除排序链表中的重复元素 II - 力扣(LeetCode) 题目描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head…

OpenHarmony-5.PM 子系统(2)

电池服务组件OpenHarmony-4.1-Release 1.电池服务组件 Battery Manager 提供了电池信息查询的接口,同时开发者也可以通过公共事件监听电池状态和充放电状态的变化。电池服务组件提供如下功能: 电池信息查询。充放电状态查询。关机充电。 电池服务组件架…

深入浅出 Linux 操作系统

深入浅出 Linux 操作系统 引言 在当今数字化的时代,Linux 操作系统无处不在。从支撑互联网巨头庞大的数据中心,到嵌入智能家居设备的微型芯片,Linux 都发挥着关键作用。然而,对于许多人来说,Linux 仍笼罩着一层神秘的…

uniapp 文本转语音

uniapp 文本转语音 基于 Minimax API 的 UniApp 文本转语音工具,支持文本分段、队列播放、暂停恢复等功能。目前只内置了 Minimax文本转语音Minimax 的语音生成技术以其自然、情感丰富和实时性强而著称 API_KEY、GroupId 获取方法 https://platform.minimaxi.com…

前端图像处理(二)

目录 一、上传 1.1、文件夹上传以及进度追踪 1.2、拖拽上传 1.3、图片裁剪上传原理 二、图片布局 2.1、渐进式图片 2.2、图片九宫格 2.3、轮播图(Js) 2.3.1、3D动画轮播图 2.3.2、旋转切换的轮播图 2.4、卡片移入翻转效果 2.5、环绕式照片墙 一、上传 1.1、文件夹…

3.BMS系统原理图解读

一、BMS电池板 (1)电池的连接关系:串联 (2)采样控制点:CELL0 - CELL5 (3)端子P1和P3:BAT和BAT- (4)开关S1:控制充放电回路的机械开关 二、BMS控制板 (1)主控MCU 电源 复位 晶振 (2)LED指示灯:4电量指示 1调试指…

用于汽车碰撞仿真的 Ansys LS-DYNA

使用 Ansys LS-DYNA 进行汽车碰撞仿真汽车碰撞仿真 简介 汽车碰撞仿真是汽车设计和安全工程的一个关键方面。这些仿真使工程师能够预测车辆在碰撞过程中的行为,从而有助于改进安全功能、增强车辆结构并符合监管标准。Ansys LS-DYNA 是一款广泛用于此类仿真的强大工具…

使用Java和不同HTTP客户端库发送各种Content-Type类型请求

1. 引言 在HTTP协议中,Content-Type头用于指示请求或响应中数据的媒体类型。了解和正确设置Content-Type 对于确保客户端和服务器之间正确解析数据至关重要。本文将介绍如何使用Java 和 不同的HTTP客户端发送各种Content-Type 类型的请求。 2. 常见的Content-Type…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA(自调制特征聚合模块),并阐述如何将其应用于YOLOv11中,显著提升模型性能。随着深度学习在计算机视觉中的不断进展,目标检测任务也在快速发展。YOLO系列模型(You Onl…

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART(串口通讯)2.1 简介2.2 时序图分析2.3 UART的…

Docker 部署 plumelog 最新版本 实现日志采集

1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…

Empire Lupin One靶机

靶机 ip:192.168.152.157 我们访问页面 第一步信息收集 我们先扫描一下端口 扫描到开启了 22 端口 80 端口 我们使用御剑扫描一下网站的后台 我们挨个访问一下 发现 apache 的帮助页面,暂时记录,看看等会有没有需要 我们查看到 robots.tx…

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…