项目场景:

刚接触Python图像处理的开发者,在学习教程时看到“使用PIL库处理图片”的指引,想按照样学样实现一个简单的图片裁剪功能。按照常规思路,先通过pip安装库,再在代码中导入使用——但这个过程中却遇到了一系列问题。

问题描述

  1. 首先根绝代码里面的

    from PIL import image
    

    想要直接下载PIL包

  2. 按照“安装PIL库”的想法,在命令行执行安装命令:

    pip install PIL
    

    结果报错,提示“找不到满足要求的PIL版本”(Could not find a version that satisfies the requirement PIL )。

原因分析:

这个问题的核心是PIL和Pillow的“历史渊源”与命名差异

  1. PIL
    PIL(Python Imaging Library)是Python最早的图像处理库,诞生于1995年,功能强大但仅支持Python 2.x。2011年后停止更新,逐渐无法兼容Python 3,逐渐被淘汰。

  2. Pillow
    由于PIL的停滞,社区在PIL的基础上fork(分支)出了Pillow项目,目的是:

    • 支持Python 3.x及后续版本
    • 修复BUG并持续维护
    • 扩展更多功能(如支持WebP、HEIF等新型格式)
  3. 命名的“妥协”
    为了兼容大量基于PIL编写的旧代码,Pillow在设计时保留了PIL作为导入名(即from PIL import ...),但安装包名改为pillow(避免与原始PIL冲突)。
    这就导致了“安装用pillow,导入用PIL”的“看似矛盾”的现象。

解决方案:

将pip安装的时候名字由PIL换为pillow即可,导入的时候仍然使用 PIL

1. 正确安装库

只能用pillow作为包名安装,这是官方指定的安装方式:

# 安装最新版本
pip install pillow

# 如需指定版本(例如9.5.0)
pip install pillow==9.5.0

2. 正确导入使用

代码中必须用PIL作为导入前缀,这是为了兼容历史代码:

# 正确示例:打开并显示一张图片
from PIL import Image

# 打开图片(替换为你的图片路径)
img = Image.open("test.jpg")

# 显示图片基本信息
print(f"图片格式:{img.format}")  # 如 JPEG、PNG
print(f"图片尺寸:{img.size}")    # 如 (1920, 1080)

# 简单处理:裁剪图片(左、上、右、下坐标)
cropped_img = img.crop((100, 100, 500, 500))

# 保存处理后的图片
cropped_img.save("cropped_result.png")

3. 避坑提醒

  • 不要尝试安装PIL(早已废弃,无法在Python 3环境使用)。
  • 不要在代码中写from pillow import ...(导入名永远是PIL)。
  • 若环境中同时存在旧版PIL和Pillow,可能导致冲突,建议卸载PIL后重新安装Pillow:
    pip uninstall PIL  # 如有旧版本
    pip uninstall pillow
    pip install pillow
    

总结来说:Pillow是PIL的“现代继承者”,安装时用pillow,使用时用PIL——记住这个“安装名≠导入名”的特殊情况,就能轻松避开这个新手常见的坑。

更多推荐