如何使用Python和PIL库生成带竖排文字的封面图像
在今天的博客中,我们将学习如何使用Python和PIL(Pillow)库生成一个简单而有创意的封面图像。我们将创建一个背景图像,并在其上绘制带有竖排文字的标题和副标题,最后再添加一些装饰性元素如星星和萤火虫。这个教程适合初学者,特别是对于那些想了解如何操作图像、使用字体和进行基本图形设计的朋友们。
目标
- 生成一个背景图像(例如:
goddess.png)。 - 在图像上绘制带有竖排文字的标题和副标题。
- 添加一些简单的装饰性图形(如星星和萤火虫)。
- 最终保存并展示生成的封面图像。
环境准备
首先,确保你已经安装了必要的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("无法加载背景图片,请确保路径正确。")returnimg = 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 randomdef 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("无法加载背景图片,请确保路径正确。")returnimg = 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 = 180y = 70for 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_heightx = 180y = 270for 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_heightfor _ 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库,我们成功地创建了一个带有竖排文字、装饰元素和自定义字体的封面图像。这种技术可以用在许多不同的应用场景中,如制作电子书封面、社交媒体封面图等。你可以根据自己的需求调整字体、文字内容和图形设计,创造出个性化的封面。
希望你能通过这个教程掌握一些基本的图像处理技巧,进一步探索更多的创意设计。如果有任何问题或改进建议,欢迎在评论区留言讨论!
相关文章:
如何使用Python和PIL库生成带竖排文字的封面图像
在今天的博客中,我们将学习如何使用Python和PIL(Pillow)库生成一个简单而有创意的封面图像。我们将创建一个背景图像,并在其上绘制带有竖排文字的标题和副标题,最后再添加一些装饰性元素如星星和萤火虫。这个教程适合初…...
低代码开发 实战转型案例一览
数字浪潮澎湃,企业应用开发需求呈井喷之势。传统全栈开发虽底蕴深厚,然其漫长周期与高昂成本,难以追赶市场快速交付的急切步伐。无代码与低代码平台顺势崛起,宛如暗夜明灯,吸引非技术人员纷至沓来,投身应用…...
SQL Server中FIRST_VALUE和 LAST_VALUE窗口函数允许在一个指定的窗口内返回第一个或最后一个值
在 SQL Server 中,FIRST_VALUE 和 LAST_VALUE 是用于窗口函数(Window Functions)的两个非常有用的函数。它们允许你在一个指定的窗口内返回第一个或最后一个值。这两个函数通常与 OVER 子句一起使用,以定义窗口的范围和排序规则。…...
机器学习-高斯混合模型
文章目录 高斯混合模型对无标签的数据集:使用高斯混合模型进行聚类对有标签的数据集:使用高斯混合模型进行分类总结 高斯混合模型 对无标签的数据集:使用高斯混合模型进行聚类 对有标签的数据集:使用高斯混合模型进行分类 总结...
微信V3支付报错 平台证书及平台证书序列号
1.平台证书及平台证书序列号设置错误报错: 错误1: Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…...
41.欠采样技术下变频不能用与跨两个nyquist的情况下
当接收到的信号位于同一nyquist区间时,信号被成功的折叠到了第一Nyquist区间中。 当接收信号位于两个或多个采样区间时,最后多个区间的信号都会被折叠到第一Nyquist区间中造成信号的重叠。...
20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题
20241227通过配置nomodeset参数解决更新grub之后,ubuntu20.04.5无法启动的问题 2024/12/27 17:34 0.397475]pci0000:00:07.0:DPC:RPPI0 l0gsize 0 is invalid dev/nvmeon1p9:clean,251849/4276224 files,3266309/17089792 blocks 缘起:公司电脑要安装加密…...
从 GitLab.com 到 JihuLab.com 的迁移指南
本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期,GitLab Inc. 针对其 SaaS 产品做了限制,如果被判定为国内用户,则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品(GitLab.com)迁移到极狐GitL…...
深度学习中的并行策略概述:2 Data Parallelism
深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…...
Python大数据可视化:基于Python对B站热门视频的数据分析与研究_flask+hive+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 排行榜界面 系统管理界面 看板展示 摘要 本项目以对B站热…...
利用 Python 编写一个 VIP 音乐下载脚本
在这篇博客中,我们将介绍如何使用 Python 编写一个简单的 VIP 音乐下载脚本,利用网页爬虫技术从一个音乐网站下载歌曲。通过解析网页,获取歌曲的真实下载链接,并将音乐文件保存到本地。我们将使用 requests 和 BeautifulSoup 库来实现这个过程。 目标 本脚本的主要功能是…...
linux内核如何实现TCP的?
TCP(传输控制协议)是网络通信中的核心协议之一,实现了可靠的、面向连接的、基于字节流的通信。在Linux内核中,TCP的实现相对复杂,涉及多个模块和层次。以下是一些关键概念和机制: 1. 协议栈 Linux 内核中的网络协议栈(Network Stack)是分层设计的,包括链路层、网络层…...
【Spring】基于XML的Spring容器配置——FactoryBean的使用
随着Spring框架应用程序的复杂性增加,开发者需要更加灵活和强大的工具来创建和管理Bean。FactoryBean是Spring提供的一种强大机制,它允许开发者自定义Bean的创建过程。这种机制不仅提高了Bean的创建灵活性,还可以简化复杂对象的构建过程。 在…...
Docker使用——国内Docker的安装办法
文章目录 参考资料前言Mac安装办法Homebrew 安装1. 直接下报错2. 安装homebrew, 用国内镜像3. 安装Docker4. 启动docker服务5. 测试是否安装成功 参考资料 鸣谢大佬文章。 macOS系统中:Docker的安装:https://blog.csdn.net/sulia1234567890…...
电商会员门店消费数据分析
导包 import os import sqlite3 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from IPython.display import display_htmlpd.set_option(max_colwidth,200)%matplotlib inline前期准备 转义路径 # 获取Windows系统下的路…...
Vue.js 入门与进阶:打造高效的前端开发体验
Vue.js 是一款渐进式的 JavaScript 框架,凭借其轻量、易用、灵活的特点,已经成为了前端开发者的首选之一。从简单的交互到复杂的单页应用(SPA),Vue 为开发者提供了一套高效且易于上手的工具。在本文中,我们…...
Java包装类型的缓存
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or Fal…...
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...
.NET平台用C#通过字节流动态操作Excel文件
在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了…...
SpringMVC详解
文章目录 1 什么是MVC 1.1 MVC设计思想1.2 Spring MVC 2 SpringMVC快速入门3 SpringMVC处理请求 3.1 请求分类及处理方式 3.1.1 静态请求3.1.2 动态请求 3.2 处理静态请求 3.2.1 处理html文件请求3.2.2 处理图片等请求 3.3 处理动态请求 3.3.1 注解说明3.3.2 示例 3.4 常见问题…...
告别手动启动:利用NSSM为任意可执行程序打造可靠的Windows后台服务
1. 为什么需要将程序注册为Windows服务? 在日常开发运维中,我们经常会遇到这样的场景:一个Python脚本需要24小时不间断运行,一个Java应用需要在服务器重启后自动恢复,或者一个Go程序需要以守护进程的方式在后台稳定执行…...
Cisco Packet Tracer实战:从零搭建一个带冗余和ACL策略的企业网络(附完整配置命令)
Cisco Packet Tracer企业网络实战:冗余架构与ACL策略深度解析 第一次在Packet Tracer中搭建完整企业网络时,我被VLAN间通信、HSRP热备切换和ACL策略的连锁反应彻底难住了。记得那个深夜,当错误配置的ACL导致整个财务部门网络瘫痪时࿰…...
告别Python依赖!用这个纯TypeScript的stock-sdk,在浏览器和Node里轻松搞定A股港股美股行情
纯TypeScript金融数据解决方案:stock-sdk全场景开发指南 金融数据获取一直是前端和Node.js开发者面临的痛点。传统方案往往依赖Python生态,导致技术栈割裂、项目臃肿。而纯TypeScript实现的stock-sdk,以其零依赖、双端运行的特点,…...
告别键盘连击烦恼:这款开源工具让你的机械键盘重获新生
告别键盘连击烦恼:这款开源工具让你的机械键盘重获新生 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 还在为键盘连击问题而…...
破局双系统文件壁垒:WinBtrfs驱动终极应用指南
破局双系统文件壁垒:WinBtrfs驱动终极应用指南 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 在Windows与Linux双系统环境中,用户常常面临跨系统文件访问的难题…...
TDOA定位算法在工业4.0中的关键应用解析(2025年更新)
1. TDOA定位算法如何重塑工业4.0生产线 想象一下,在一个现代化的汽车工厂里,几十台焊接机器人正在流水线上精准作业,数百辆AGV小车穿梭运送零件,而它们之间始终保持5厘米的安全距离——这种零碰撞、高效率的协作背后,正…...
Linux下objdump反汇编实战:从二进制文件到可读代码的深度解析
1. 初识objdump:二进制世界的翻译官 第一次接触objdump时,我把它比作"二进制世界的翻译官"。这个比喻来自我调试段错误时的经历——当时面对崩溃的core dump文件手足无措,直到同事教我用了objdump -d。这个GNU工具链中的瑞士军刀&a…...
从‘歪图’到精准底图:ENVI几何校正实战避坑与精度提升指南
从‘歪图’到精准底图:ENVI几何校正实战避坑与精度提升指南 当你在山区项目中打开刚获取的遥感影像时,那些本该笔直的道路却像蛇形般扭曲,原本规整的农田边界变成了抽象画作——这就是未经几何校正的"歪图"给科研工作者带来的日常困…...
如何利用Postiz实现高效社交媒体管理:AI驱动的智能调度解决方案
如何利用Postiz实现高效社交媒体管理:AI驱动的智能调度解决方案 【免费下载链接】clickvote 📨 The ultimate social media scheduling tool, with a bunch of AI 🤖 项目地址: https://gitcode.com/GitHub_Trending/cl/clickvote Pos…...
Clawdbot 是如何实现永久记忆的?
下文是如何构建的在深入探讨记忆之前,我们先来理解模型在每次请求时能看到什么:[0] 系统提示词(静态指令 条件指令) [1] 项目上下文(引导文件:AGENTS.md、SOUL.md 等) [2] 对话历史(…...
