【图片操作】批量生成缩略图

简介: 在我们日常生活中,缩略图很大程度减少了我们内存的使用。如果我们看一张图片就必须加载完成后才能看,那么我们就会发现很多应用都变慢了很多,而且流量也消耗的很快。今天我们就来看看Python生成缩略图的操作。

一、前言

在我们日常生活中,缩略图很大程度减少了我们内存的使用。如果我们看一张图片就必须加载完成后才能看,那么我们就会发现很多应用都变慢了很多,而且流量也消耗的很快。今天我们就来看看Python生成缩略图的操作。

二、Pillow模块

这里我们还是使用Pillow来实现,如果不了解Pillow可以参考【图片操作】批量转换黑白图片

1、安装

Pillow的安装只需要执行下面的语句:

pip install pillow
复制代码

这里在上一篇也提到了,这里就不再细说了。

2、简单操作

这里我们回顾一下Pillow的简单操作,这里直接看代码:

# 导入Image子模块
from PIL import Image
# 读取图片
img = Image.open("1.jpg")
# 显示图片
img.show()
# 保存图片
img.save("11.jpg")
复制代码

上面几个操作都非常简单,就是图片的最基本的操作。其中我们使用的是Image子模块,这是Pillow最常用的一个模块。

3、生成缩略图

我们通过Image.open函数打开图片后,返回的图片对象有两个方法可以用来生成缩略图,我们先来看看resize方法:

from PIL import Image
img = Image.open("1.jpg")
# 修改图片尺寸
img = img.resize((100, 50))
img.save("11.jpg")
复制代码

这里我们调用了resize方法,并传入了一个尺寸的元组,下面是我们的缩略图效果:

网络异常,图片无法展示
|
可以看到,我们的缩略图有点变形了,在我们不知道原图尺寸的情况下,图片变形是很常见的事,那能不能解决呢?其实是可以的,我们可以把上面代码修改一下:

from PIL import Image
img = Image.open("1.jpg")
# 获取原图尺寸
w, h = img.size
# 根据原图尺寸来设置缩略图大小
img = img.resize((w//3, h//3))
img.save("11.jpg")
复制代码

这里我们现获取了原图的尺寸,然后再将宽高缩小到原来的1/3,这样缩略图就不会变形了。另外我们还有个更简单的方法:

from PIL import Image
img = Image.open("1.jpg")
# 生成缩略图
img.thumbnail((100, 20))
img.save("11.jpg")
复制代码

这里我们直接使用thumbnail方法来生成缩略图,这里默认是不会变形的,即使我们的尺寸是不协调的,它也会根据我们传的参数来进行缩放。它的缩放规则如下:缩放倍数=1/min{W/w, H/h}。其中W、H是原图尺寸,w、h是传入的尺寸。

三、批量生成缩略图

这里我们直接上代码:

import os
from PIL import Image
# 创建目录用于存储生成的图片
save_dirname = "test_thumb"
if not os.path.exists(save_dirname):
    os.mkdir(save_dirname)
dirname = "test"
imgs = [os.path.join(dirname, i) for i in os.listdir(dirname)]
for idx, img in enumerate(imgs):
    if img.endswith("jpg") or img.endswith("png") or img.endswith("jpeg"):
        img = Image.open(img)
        img.thumbnail((100, 200))
        img.save("test_thumb/" + str(idx) + ".jpg")
复制代码

这里和上一篇的最后一部分几乎是一样的,读者可以参考上一篇【图片操作】批量转换黑白图片


目录
相关文章
|
JavaScript 前端开发 小程序
HaaS UI - 轻量级IoT小程序解决方案
HaaS UI是一套应用在HaaS硬件上的轻量级IoT小程序解决方案,支持AliOS Things内核,支持用JS开发UI应用,同时也支持Native App(不做主要推荐)。
HaaS UI - 轻量级IoT小程序解决方案
|
7月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
572 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
10月前
|
人工智能 Cloud Native 数据可视化
微医控股与阿里云达成战略合作,双方将携手基于通义千问大模型联合打造医疗全场景智能体,共同构建医疗垂类大模型
2025年6月17日,微医控股与阿里云达成战略合作,共建医疗AI基座及医疗全场景智能体。双方将基于通义千问大模型打造医疗垂类大模型,升级微医“5+1”智能体,并在诊断、用药、健康管理等环节深化应用。微医将结合阿里云技术优势推进IDC上云,助力AI+医疗基础设施建设,共同制定行业标准并推广城市级AI数字健共体。目前,微医AI服务已连接全国1.2万家医院和30万名医生,健康管理会员超100万。
1809 2
|
存储 NoSQL 算法
文件上传下载系列——如何实现文件秒传
文件上传下载系列——如何实现文件秒传
|
定位技术 Android开发
Android 12蓝牙报java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission
Android 12蓝牙报java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission
946 1
|
Android开发 C++
Android S HAL库的编译
Android S HAL库的编译
290 0
|
Kubernetes 关系型数据库 Linux
K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品
K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品
|
数据采集 Web App开发 JavaScript
Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能
大概还是入门期,我曾用Puppeteer做爬虫工具以此来绕过某网站的防爬机制。近期有需求要做任意链接网页截图,像这种场景非常适合用Puppeteer完成。无头浏览器我已知的还有Selenium。
746 2
Puppeteer无头浏览器:开启自动化之门,掌握浏览器世界的无限可能
|
Linux C语言 C++
编译器之自举
**要阅读本文,不需要太高深的编译原理知识,甚至不需要编译相关的知识。但是本文也不是面向对电脑一无所知的读者的,你至少要知道: 不管是exe可执行文件还是Linux下的程序,都是一些二进制代码,我们称之为机器语言。
1607 0
|
弹性计算 API 对象存储
OSS访问域名使用规则
OSS会为每一个存储空间(Bucket)分配默认的访问域名,本文介绍OSS访问域名的构成规则及使用方式。
728 0