Python - PIL 的使用

本文介绍了一种使用Python Image Library (PIL) 进行图片等比例压缩的方法,该方法可以确保图片在压缩过程中保持原有的长宽比,适用于对上传图片进行预处理的场景。

1. 引言

PIL,全称 Python Image Library,主要作用是图像处理

在大多数的项目中,可能用的较多的就是对上传图片的压缩和缩放

下面方法是本人在项目中使用的,用于等比例压缩图片的方法

2. 封装方法

def compress_image(source, dest, width):
    """
    压缩图片,通过参数width指定压缩后的图片大小
    :param source: 图片的源路径
    :param dest: 压缩后保存的途径
    :param width: 指定宽度
    :return: 
    """
    from PIL import Image

    # 如果图片宽度大于指定宽度。则调整为指定的高度
    im = Image.open(source)
    x, y = im.size  # 获取源图片的宽高
    if x > width:
        # 等比例缩放
        ys = int(y * width / x)
        xs = width

        # 调整当前图片的尺寸(同时也会压缩大小)
        temp = im.resize((xs, ys), Image.ANTIALIAS)

        # 将图片保存并使用80%的质量进行压缩(继续压缩)
        temp.save(dest, quality=80)
    else:  # 如果尺寸小于指定宽度则不缩减尺寸,只压缩保存
        im.save(dest, quality=80)
### Python PIL 库的简介 PILPython Imaging Library)是一个用于处理图像的强大工具包。尽管官方支持已经停止,但它的一个分支 `Pillow` 继续维护并扩展了其功能[^1]。 Pillow 是 PIL 的一个友好分支,兼容大多数 PIL 接口,并提供了更多的特性和支持。 以下是关于如何使用 PIL/Pillow 进行基本操作的一些说明: --- ### 安装 Pillow 由于原始的 PIL 已经不再更新,推荐安装 Pillow 来替代它。可以通过以下命令安装最新版本的 Pillow: ```bash pip install pillow ``` 如果需要指定特定版本,则可以按照如下方式完成: ```bash pip install pillow==9.0.0 ``` 这一步骤遵循最佳实践,即锁定依赖项的具体版本以确保环境的一致性和可重复构建[^2]。 --- ### 基本用法示例 #### 打开和显示图片 下面展示了一个简单的例子来加载一张图片并将其显示出来: ```python from PIL import Image # 加载本地文件中的图片 image = Image.open("example.jpg") # 显示图片 image.show() ``` 上述代码片段展示了如何通过路径读取一幅图像,并调用 `.show()` 方法在默认查看器中打开该图。 #### 调整大小 调整图像尺寸是非常常见的需求之一。这里提供了一种方法实现此目的: ```python resized_image = image.resize((800, 600)) resized_image.save('resized_example.jpg') ``` 这段脚本会创建一个新的具有固定宽度和高度的新副本,并保存到磁盘上[^3]。 #### 图像裁剪 有时可能只需要保留原图的一部分区域作为新作品的基础素材,在这种情况下可以用 crop 函数轻松达成目标: ```python box = (100, 100, 400, 400) # 设置左、上、右、下的坐标位置 cropped_region = image.crop(box) cropped_region.save('cropped_example.jpg', 'JPEG') ``` 以上实例定义了一个矩形框选范围,然后提取这部分内容另存为独立文档。 --- ### 高级应用案例 对于更复杂的场景比如视频帧捕捉或者实时摄像头流分析来说,单独依靠 PIL 可能不足以满足全部需求;此时引入 OpenCV 就显得尤为重要——后者能够很好地补充前者不足之处的同时还具备更强的数据处理能力。 例如当涉及到大量连续画面序列时,我们可以先利用 OpenCV 获取每一帧数据再交给 PIL 处理颜色空间转换等问题: ```python import cv2 from PIL import Image cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break pil_frame = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) # 对 PIL 对象进一步加工... cv2.destroyAllWindows() cap.release() ``` 在这里我们混合运用两个库各自的优势完成了从硬件采集到最后渲染整个流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lt0_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值