当前位置: 首页 > news >正文

Python案例分析|使用Python图像处理库Pillow处理图像文件

图片

本案例通过使用Python图像处理库Pillow,帮助大家进一步了解Python的基本概念:模块、对象、方法和函数的使用

使用Python语言解决实际问题时,往往需要使用由第三方开发的开源Python软件库。

本案例使用图像处理库Pillow中的模块、对象来处理图像:实现读取图像、获取图像信息、调整图像大小、旋转图像、平滑图像、剪切图像等基本图像处理任务。

 

01、安装Pillow

Pillow是Python中的图像处理库(PIL,Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

Pillow位于Python包索引(PyPI)中,可以使用pip来安装。注意,Anaconda包含了Pillow库。

【例1】使用pip安装Pillow库。

以管理员身份运行命令行提示符,输入命令pip3 install Pillow,安装Pillow库。如图1所示。

图片

■ 图1  使用pip安装Pillow库

02、打开和显示图像

Pillow库包含几十个模块,组织在名为PIL的包中。PIL包中的一个模块是Image。PIL.Image提供了一些包括从文件中加载图像和创建新图像的函数,其中的Image用于表示图像对象。

【例2】打开和显示图像。

使用PIL.Image模块的open()函数可以打开一个图像,返回一个图像对象,然后调用图像对象的show()方法,可以在屏幕上显示图像。

>>> import PIL; from PIL import Image
>>> im = PIL.Image.open("c:/pythonpa/cs/img/mandrill.jpg")
>>> im.show()
>>> print(im.format, im.size, im.mode) #显示图像的格式、大小和模式信息
JPEG (298, 298) RGB

说明/

(1)im.format返回包含图像格式的字符串(JPEG、GIF、TIFF、BMP、PNG、…)。

(2)im.size返回包含图像宽度和高度的元组,单位为像素。与每个像素相关的是一对坐标(i, j),用于标识像素的列i和行j。列从左到右编号,从0开始;行从上到下编号,也从0开始。

(3)im.mode返回包含图像模式的字符串(RGB、CYMK、Grayscale、…)。

03、图像的基本操作

图像对象的copy()方法用于拷贝图像;crop()方法用于剪裁图像;paste()方法用于将一个图像粘贴(覆盖)在另一个图像上面;resize()方法用于调整图像大小;rotate()方法用于旋转和翻转图像;filter()方法用于图像过滤。

Pillow提供的图像处理工具包括其它众多模块。有关Pillow的更多信息,请查阅在线文档http://pillow.readthedocs.org。

使用PIL.Image模块中的函数new()可以创建一个给定模式和大小的新图像对象。例如,创建一个新的大小为800×600的RGB图像的代码如下:

>>> im2 = PIL.Image.new('RGB', (800,600))

【例3】图像的基本操作示例。

把一幅图像的4个副本排列成2×2网格:在左上方的副本是原始图像,而画面右上方、左下方、右下方则分别使用模块PIL.ImageFilter中定义的内置过滤器CONTOUR、EMBOSS、FIND_EDGES进行过滤。

#模块:c:\pythonpa\cs\image_test.py
#命令行:python image_test.py c:\pythonpa\cs\img\mandrill.jpg
#功能:把c:\pythonpa\cs\img\mandrill.jpg的4个副本排列成2×2网格并显示
import sys
import os
import PIL.Image
import PIL.ImageFilter
im = PIL.Image.open(sys.argv[1])
width, height = im.size
# 创建新图像,大小为原始图像的4倍
res = PIL.Image.new(im.mode, (2*width, 2*height))
# 把原始图像放置在左上角
res.paste(im, (0, 0, width, height))
# 把轮廓过滤CONTOUR的图像放置在右上角
contour = im.filter(PIL.ImageFilter.CONTOUR)
res.paste(contour, (width, 0, 2*width, height))
# 把浮雕过滤EMBOSS的图像放置在左下角
emboss = im.filter(PIL.ImageFilter.EMBOSS)
res.paste(emboss, (0, height, width, 2*height))
# 把边缘过滤FIND_EDGES的图像放置在右下角
edges = im.filter(PIL.ImageFilter.FIND_EDGES)
res.paste(edges, (width, height, 2*width, 2*height))
# 显示结果图像
res.show()

04、批量图像格式转换

使用PIL.Image模块的open()函数打开磁盘图像文件时,会根据文件内容自动确定文件格式。使用Image对象的save()方法保存图像时,可以指定格式,从而实现格式转换。

【例4】批量图像格式转换。

#模块:c:\pythonpa\cs\image_convert.py
#命令行:python image_convert.py c:\pythonpa\cs\img jpg png
#功能:把c:\pythonpa\cs\img下的所有jpg文件转换为png文件
import sys
import glob
import os
import PIL.Image
img_path = sys.argv[1] + "/*." + sys.argv[2]
for infile in glob.glob(img_path):f,e = os.path.splitext(infile)outfile = f + "." + sys.argv[3]PIL.Image.open(infile).save(outfile)

说明/

(1)glob模块可以使用通配符匹配文件名。例如glob.glob("c:\tmp\*.jpg"),可以返回c:\tmp下的所有后缀为jpg的文件列表。

(2)os.path.splitext(p)可以拆分文件名和后缀。

 

05、批量创建缩略图

缩略图是网络开发或图像软件预览常用的一种基本技术,使用Python的Pillow图像库中Image模块中的Image对象的thumbnail()方法,可以很方便地建立缩略图。

【例5】批量创建缩略图。

#模块:c:\pythonpa\cs\ image_thumbnail.py
#命令行:python image_thumbnail.py c:\pythonpa\cs\img jpg
#功能:把c:\pythonpa\cs\img下的所有*.jpg文件转换为*_s.jpg缩略图
import sys
import os
import glob
import PIL.Image
img_path = sys.argv[1] + "/*." + sys.argv[2]
size = (128,128)
for infile in glob.glob(img_path):f,e = os.path.splitext(infile)outfile = f + "_s." + sys.argv[2]img = PIL.Image.open(infile)img.thumbnail(size, PIL.Image.ANTIALIAS)img.save(outfile)

说明/

(1)glob模块可以使用通配符匹配文件名。例如glob.glob("c:\tmp\*.jpg"),可以返回c:/tmp下的所有后缀为jpg的文件列表。

(2)os.path.splitext(p)可以拆分文件名和后缀。

 

06、批量图像加文字水印

图片加水印是防止盗版的有效方式之一。首先使用Python的Pillow图像库中的Image模块的new函数可以创建水印图像对象,并使用ImageDraw模块在水印图像上绘制文字,最后通过Image模块的composite函数合成水印图像和原图像。

【例6】批量图像加文字水印。

#模块:c:\pythonpa\cs\image_watermark1.py
#命令行:python image_watermark1.py c:\pythonpa\cs\img jpg "Python"
#功能:把c:\pythonpa\cs\img下的所有*.jpg文件加"Python"水印并另存为*_w.jpg
import sys
import os
import glob
from PIL import Image, ImageDraw, ImageFont
img_path = sys.argv[1] + "/*." + sys.argv[2]
img_suffix = sys.argv[2]
txt_log = sys.argv[3]
for infile in glob.glob(img_path):f, e = os.path.splitext(infile)outfile = f + "_w." + img_suffixim = Image.open(infile)im_log = Image.new('RGBA', im.size)fnt = ImageFont.truetype("c:/Windows/fonts/Tahoma.ttf", 20)d = ImageDraw.ImageDraw(im_log)d.text((0, 0), txt_log, font = fnt)im_out = Image.composite(im_log, im, im_log)im_out.save(outfile)

07、批量图像加图片水印

加图片水印的原理和加文字水印相同,首先使用Python的Pillow图像库中的Image模块的new函数可以创建水印图像对象,并使用图像对象的paste方法把log图像粘贴到水印图像,最后通过Image模块的composite函数合成水印图像和原图像。

【例7】批量图像加图片水印。

#模块:c:\pythonpa\cs\image_watermark2.py
#命令行:python image_watermark2.py c:\pythonpa\cs\img jpg c:\pythonpa\cs\img\python-logo.png
#功能:把c:\pythonpa\cs\img下的所有*.jpg文件加水印python-logo.png并另存为*_w.jpg
import sys
import os
import glob
from PIL import Image, ImageDraw, ImageFont
img_path = sys.argv[1] + "/*." + sys.argv[2]
img_suffix = sys.argv[2]
log_file = sys.argv[3]
for infile in glob.glob(img_path):f, e = os.path.splitext(infile)outfile = f + "_w." + img_suffixim = Image.open(infile)im_log = Image.open(log_file)im_mark = Image.new('RGBA', im.size)im_mark.paste(im_log, (0, 0))im_out = Image.composite(im_mark, im, im_mark)im_out.save(outfile)

 

08、批量调整图像大小

调整图像大小也是网络开发或图像软件预览常用的一种基本技术。使用Image对象的resize()方法可以调整图像大小。

【例8】批量调整图像大小。

#模块:c:\pythonpa\cs\image_resize.py
#命令行:python image_resize.py c:\pythonpa\cs\img jpg 640 480
#功能:把c:\pythonpa\cs\img下的所有*.jpg文件大小调整为640*480并另存为*_640.jpg
import sys
import os
import glob
import PIL.Image
img_path = sys.argv[1] + "/*." + sys.argv[2]
img_suffix = sys.argv[2]
img_size_width = int(sys.argv[3])
img_size_height = int(sys.argv[4])
for infile in glob.glob(img_path):f, e = os.path.splitext(infile)outfile = f + "_" + str(img_size_width) + "." + img_suffixim = PIL.Image.open(infile)im_out = im.resize((img_size_width, img_size_height))im_out.save(outfile)

相关文章:

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow,帮助大家进一步了解Python的基本概念:模块、对象、方法和函数的使用 使用Python语言解决实际问题时,往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…...

音视频——压缩原理

H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛, 最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。 但为了用好H264,我们还是要对…...

微服务 云原生:搭建 K8S 集群

为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。 基础准备 关…...

C++中的数学问题---进制转换

二进制转十六进制 string binToHex(string bin){string hex"";if(bin.size()%4!0){for(int i0;i<(4-bin.size()%4);i){bin"0"bin;}}for(int i0;i<bin.size();i4){string tmpbin.substr(i,4);bitset<4>b(tmp);hexb.to_ulong()<10?char(b.t…...

开发一个RISC-V上的操作系统(三)—— 串口驱动程序(UART)

目录 文章传送门 一、什么是串口 二、本项目串口的FPGA实现 三、串口驱动程序的编写 四、上板测试 文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&…...

nuxt项目部署,npm run build 和npm run generate的区别

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 非服务端渲染的项目&#xff0c;比如普通的vite vue项目&#xff0c;我们在部署生产环境的时候&#xff0c;只需要两步 运行 npm run build 然后得到了一个 dist 文件夹将这个dist文件夹部署到一个静态服务器…...

数据仓库设计理论

数据仓库设计理论 一、数据仓库基本概念 1.1、数据仓库介绍 数据仓库是一个用于集成、存储和分析大量结构化和非结构化数据的中心化数据存储系统。它旨在支持企业的决策制定和业务分析活动。 1.2、基本特征 主题导向&#xff1a;数据仓库围绕特定的主题或业务领域进行建模…...

数据接口有哪些?(数据接口有哪几种)

数据接口是指不同应用程序或系统之间交换数据的通信界面。在现代信息化社会中&#xff0c;数据接口扮演着极为重要的角色&#xff0c;它们使得不同平台之间能够相互连接和交流&#xff0c;从而实现数据共享和应用集成。 数据接口的种类繁多&#xff0c;常见的有以下几种&#…...

华为云CodeArts产品体验的心得体会及想法

文章目录 前言CodeArts 的产品优势一站式软件开发生产线研发安全Built-In华为多年研发实践能力及规范外溢高质高效敏捷交付 功能特性说明体验感受问题描述完结 前言 华为云作为一家全球领先的云计算服务提供商&#xff0c;致力于为企业和个人用户提供高效、安全、可靠的云服务。…...

下载安装:SQLite+SQLiteStudio+VS

目录 1、SQLite 1.1、下载SQLite 1.2、配置SQLite的环境变量 2、SQLite Studio 2.1、下载SQLite Studio 2.2、安装SQLite Studio 3、Visual Studio 3.1、下载Visual Studio 3.2、安装Visual Studio 1、SQLite 1.1、下载SQLite SQLite官网&#xff1a;SQLite Downl…...

nginx路由

一般我们经常在访问网站时&#xff0c;通常会遇到输入某个页面的网址时&#xff0c;出现路由的转发&#xff0c;重定向等。可能访问的是一个网址&#xff0c;出来的时候就显示的是另外的地址。这是由于使用了nginx的缘故&#xff0c;保护了网址的安全性 &#xff08;1&#xf…...

MobPush Android SDK 厂商推送限制

概述 厂商推送限制 每个厂商通道都有对应的厂商配额和 QPS 限制&#xff0c;当请求超过限制且已配置厂商回执时&#xff0c;MobPush会采取以下措施&#xff1a; 当开发者推送请求超过厂商配额时&#xff0c;MobPush将通过自有通道进行消息下发。当开发者推送请求超过厂商 QP…...

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 …...

gitee 配置ssh 公钥(私钥)

步骤1&#xff1a;添加/生成SSH公钥&#xff0c;码云提供了基于SSH协议的Git服务&#xff0c;在使用SSH协议访问项目仓库之前&#xff0c;需要先配置好账户/项目的SSH公钥。 绑定账户邮箱&#xff1a; git config --global user.name "Your Name" git config --glob…...

JAVA面试总结-Redis篇章(七)——数据淘汰策略

JAVA 面试总结-数据淘汰策略...

[SQL挖掘机] - 算术函数 - round

介绍: 当谈到 SQL 中的 round 函数时&#xff0c;它用于将一个数值四舍五入到指定的小数位数。 用法: round 函数的用法如下&#xff1a; round(number, decimals)其中&#xff0c;number 是要进行四舍五入的数值&#xff0c;decimals 是要保留的小数位数。round 函数接受两…...

php-golang-rpc spiral/goridge库和php spiral/goridge2.4.5实践

golang 代码&#xff1a; package main import ( "fmt" "net" "net/rpc" "github.com/spiral/goridge/v2" ) type App struct{} func (*App) Hi(name string, r *string) error { *r fmt.Sprintf("hello %s!", name) re…...

关于Kubernetes的一些零碎想法

关于Kubernetes的一些零碎想法 容器集群管理系统与容器编排系统 很多使用Kubernetes的企业可能没有认识到Kubernetes最重要的特点。许多企业将其视为一种容器集群管理系统&#xff08;container management system&#xff09;&#xff0c;只使用其管理容器的能力。然而&#x…...

C—数据的储存(下)

文章目录 前言&#x1f31f;一、练习一下&#x1f30f;1.例一&#x1f30f;2.例二&#x1f30f;3.例三&#x1f30f;4.例四 &#x1f31f;二、浮点型在内存中的储存&#x1f30f;1.浮点数&#x1f30f;2.浮点数存储&#x1f4ab;&#xff08;1&#xff09;.二进制浮点数&#x…...

「软件测试面试干货」2023年软件测试面试题大全(持续更新)附答案..

先卖个关子&#xff0c;如果你是面试官&#xff0c;你希望招一个什么样的人进来&#xff1f; 如果这个问题搞明白了&#xff0c;那么可以说测试岗位的面试&#xff0c;就变得非常轻松了。 按照一般的惯例&#xff0c;面试官都会让你自我介绍&#xff0c;介绍你的项目经验&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块&#xff0c;提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中&#xff0c;这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构&#xff0c;与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法

Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...