如何使用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 常见问题…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...