使用Python和PIL库进行图片比例缩放

简介

本教程将指导你如何使用Python编程语言和PIL(Python Imaging
Library,现在称为Pillow)库来按比例缩放图片。按比例缩放意味着在保持图片原有宽高比的前提下,将图片的尺寸调整到指定的最大宽度和高度内。

准备工作

在开始之前,请确保你已经安装了Python和Pillow库。如果还没有安装Pillow库,可以通过以下命令安装:

pip install Pillow

代码解析

from pathlib import Path
from PIL import Image


def resize_image_proportionally(input_path, output_dir, max_width=1920, max_height=1200):
    """
    将图片缩放到指定宽高内,而保持原来的宽高比
    :param input_path:输入图片文件路径
    :param output_dir:输出图片文件夹路径
    :param max_width:缩放后图片最大宽度
    :param max_height:缩放后图片最大高度
    """
    # 打开图片
    try:
        img = Image.open(input_path)
    except Exception as e:
        print(f'打开图片出现错误:{e}')
        return

        # 获取原始图片的尺寸
    original_width, original_height = img.size

    # 只有图片宽度或高度超出指定范围,才缩放图片
    if original_width > max_width or original_height > max_height:
        # 计算缩放比例
        ratio = min(max_width / original_width, max_height / original_height)
    else:
        print(f'原图宽高小于指定值,不适合缩放:{input_path}')
        return

    # 计算新尺寸
    new_width = int(original_width * ratio)
    new_height = int(original_height * ratio)

    # 缩放图片
    img_resized = img.resize((new_width, new_height), Image.LANCZOS)

    # 保存图片
    output_path = Path(output_dir).joinpath(Path(input_path).name)
    img_resized.save(output_path)
    print(f'输出缩放图片:{output_path}')

1. 导入必要的库
from pathlib import Path
from PIL import Image
  • Path:用于路径操作,提供跨平台的路径处理能力。
  • Image:Pillow库中用于图像处理的模块。
2. 定义函数resize_image_proportionally
def resize_image_proportionally(input_path, output_dir, max_width=1920, max_height=1200):
    """
    将图片缩放到指定宽高内,而保持原来的宽高比
    :param input_path:输入图片文件路径
    :param output_dir:输出图片文件夹路径
    :param max_width:缩放后图片最大宽度
    :param max_height:缩放后图片最大高度
    """

这个函数接受四个参数:输入图片的路径、输出目录的路径、最大宽度和最大高度。最大宽度和最大高度是可选参数,默认值分别为1920和1200。

3. 打开图片
try:
    img = Image.open(input_path)
except Exception as e:
    print(f'打开图片出现错误:{e}')
    return

使用Image.open尝试打开图片文件。如果出现错误(例如文件不存在或损坏),将打印错误信息并返回。

4. 获取原始图片尺寸
original_width, original_height = img.size

img.size返回一个元组,包含图片的宽度和高度。

5. 判断是否需要缩放
if original_width > max_width or original_height > max_height:
    # 计算缩放比例
    ratio = min(max_width / original_width, max_height / original_height)
else:
    print(f'原图宽高小于指定值,不适合缩放:{input_path}')
    return

如果图片的宽度或高度超出了指定的最大值,计算缩放比例。否则,打印一条消息并返回,因为图片不需要缩放。

6. 计算新尺寸
new_width = int(original_width * ratio)
new_height = int(original_height * ratio)

根据缩放比例计算新的宽度和高度。

7. 缩放图片
img_resized = img.resize((new_width, new_height), Image.LANCZOS)

使用resize方法按计算出的新尺寸缩放图片。Image.LANCZOS是一种高质量的重采样滤波器。

8. 保存图片
output_path = Path(output_dir).joinpath(input_path.name)
img_resized.save(output_path)
print(f'输出缩放图片:{output_path}')

将缩放后的图片保存到指定的输出目录,并打印出保存的路径。

使用方法

要使用这个脚本,你需要指定输入图片的路径和输出目录的路径。例如:

resize_image_proportionally('path/to/your/image.jpg', 'path/to/output/directory')

这将把image.jpg按比例缩放到最大宽度1920和最大高度1200内,并保存到指定的输出目录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …

iMetaOmics | 刘永鑫/陈同-用于食物微生物组成和时间序列研究的微生物组数据库FoodMicroDB...

点击蓝字 关注我们 FoodMicroDB&#xff1a;用于食物微生物组成和时间序列研究的微生物组数据库 iMeta主页&#xff1a;http://www.imeta.science 研究论文 ● 原文链接DOI: https://doi.org/10.1002/imo2.40 ● 2024年11月1日&#xff0c;中国农业科学院深圳农业基因组研究所刘…

视觉slam十四讲 ch8 光流法和直接法

之前的都是单层光流 转载至Blibli 视觉SLAM十四讲_7视觉里程计1_计算相机运动_哔哩哔哩_bilibili

QSS 设置bug

问题描述&#xff1a; 在QWidget上add 一个QLabel&#xff0c;但是死活不生效 原因&#xff1a; c 主程序如下&#xff1a; QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统

安装WSL命令 管理员打开PowerShell或Windows命令提示符&#xff0c;输入wsl --install&#xff0c;然后回车 注意&#xff1a;此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意&#xff1a;默认安装最新的Ubuntu发行版。 注意&#xff1a;默认安装路径是…

【学习心得】算力云平台上的大模型部署并实现远程调用

以AutoDL算力云平台为例&#xff0c;部署国产开源ChatGLM3b模型。 一、准备工作 &#xff08;1&#xff09;准备一台算力服务器 首先&#xff0c;进入AutoDL官网的算力时长选择算力服务器资源。 创建好后会自动跳转控制台的“容器实例”界面&#xff0c;稍等片刻后选择“快捷…

Vue 中的透传,插槽,依赖注入

1. 透传attributes 在组件上使用透传attribute&#xff1a; 当你在父组件中使用子组件时&#xff0c;你可以添加一些attribute到子组件上&#xff0c;即使这些attribute没有在子组件的props中声明。 父组件&#xff1a; <!-- 父组件&#xff0c;例如 ParentComponent.vue…

97.【C语言】数据结构之栈

目录 栈 1.基本概念 2.提炼要点 3.概念选择题 4.栈的实现 栈初始化函数 入栈函数 出栈函数和栈顶函数 栈顶函数 栈销毁函数 栈 基本概念参见王爽老师的《汇编语言 第四版》第56和57页 节选一部分 1.基本概念 注意:这里提到的数据结构中的栈有别于操作系统的栈,后者是…

Spring-boot 后端java配置接口返回jsp页面

Spring-boot 后端java配置接口返回jsp页面 spring boot 基于spring MVC的基础上进行了改进&#xff0c; 将Controller 与ResponseBody 进行了合并成一个新的注解 RestController。 当用户请求时&#xff0c;需要有视图渲染的&#xff0c;与请求数据的请求分别使用 1.在appli…

【操作系统实验课】Makefile与编译

1. 创建项目结构 my_project 使用mkdir命令在根目录下创建项目my_project sudo mkdir /my_project 进入my_project目录 cd my_project src 在my_project目录下创建src子目录 sudo mkdir src 进入src目录 cd src root(根用户) 切换用户身份为root(根用户) root用户…

冠层四流近似模型的发展历史

1. Kunbelka-Munk theory This is the earlist model using a two-stream approximation d I d z − ( k s ) I s J d J d z ( k s ) J − s I \begin{aligned} &\frac{dI}{dz} -(ks)IsJ\\ &\frac{dJ}{dz} (ks)J - sI \end{aligned} ​dzdI​−(ks)IsJdzdJ​(…

Linux从0——1之shell编程4

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型&#xff08;LLM&#xff09;的表示中&#xff0c;以提高其在图数据上自…

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断 目录 文章目录 【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数&#xff1a;★★★★☆后记 大型语言模型中的最佳解释推断 摘…

【最新鸿蒙开发之性能优化——动态加载和延迟加载】

大家好&#xff0c;我是学徒小z&#xff0c;在经历了一段时间项目开发中&#xff0c;我也渐渐意识到了性能的重要性&#xff0c;今天就分享一篇优化应用运行性能的文章&#xff0c;话不多说&#xff0c;开干&#xff01; 引言 延时触发操作与延迟加载的简介 动态加载&#x…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用&#xff0c;职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室&#xff0c;为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台&#xff0c;以促进云计算技术…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block&#xff0c;pendding&#xff0c;handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢&#xff1f; 案例 信号处理 操作系统是如何运行的&#xff1f; 硬件中断 …

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转(跨文件跳转)这些功能

&#xff08;一&#xff09;方法一&#xff1a;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&am…

初识算法 · 模拟(1)

目录 前言&#xff1a; 替换所有的问号 题目解析 算法原理 算法编写 提莫攻击 题目解析 算法原理 算法编写 外观数列 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是模拟&#xff0c;通过三道题目讲解&#xff0c;一道是提莫攻击&#xff0c;一道是…