下面我将为你详细介绍几种在 Python 中保存图片的常用方法,从最基础的到更高级和通用的方法。

使用 Pillow 库(最常用)
Pillow 是 Python 图像处理库(PIL)的一个现代分支,功能强大,是处理本地图片、创建新图片并将其保存到文件的首选。
安装 Pillow 如果你的环境中没有安装,需要先安装它:
pip install Pillow
基本用法:从数组创建并保存图片
你可以使用 NumPy 创建一个像素数组,然后用 Pillow 将其保存为图片。

from PIL import Image
import numpy as np
# 1. 创建一个示例数据(一个 100x100 的红色图片)
# 数组的形状是 (高度, 宽度, 通道数)
# 对于 RGB 图片,通道数是 3 (R, G, B)
# 值范围通常是 0-255
data = np.zeros((100, 100, 3), dtype=np.uint8)
data[:, :, 0] = 255 # 将红色通道设置为 255
data[:, :, 1] = 0 # 将绿色通道设置为 0
data[:, :, 2] = 0 # 将蓝色通道设置为 0
# 2. 从 NumPy 数组创建一个 Pillow Image 对象
image = Image.fromarray(data, 'RGB')
# 3. 保存图片到文件
# 'red_image.png' 是你想要保存的文件名
# PNG 是一种无损压缩格式,JPG/JPEG 是有损压缩格式
image.save('red_image.png')
print("图片已保存为 red_image.png")
# 你也可以保存为其他格式,JPG
# 注意:JPG 格式不支持透明度(alpha 通道)
image.save('red_image.jpg')
print("图片已保存为 red_image.jpg")
保存 Pillow 对象
如果你已经有了一个 Pillow 的 Image 对象(比如通过打开一个文件或者进行图像处理后),直接调用 save() 方法即可。
from PIL import Image
# 打开一个已有的图片
try:
img = Image.open('source_image.jpg') # 假设你有一张名为 source_image.jpg 的图片
# 对图片进行处理,比如调整大小
img_resized = img.resize((200, 200))
# 保存处理后的图片
img_resized.save('resized_image.jpg')
print("图片已调整大小并保存为 resized_image.jpg")
except FileNotFoundError:
print("错误:找不到 source_image.jpg 文件,请确保该文件在脚本同目录下。")
从网络请求保存图片(网络爬虫场景)
这是 tuxiangbaocun 最常见的应用场景之一:从 URL 下载图片并保存到本地,我们通常使用 requests 库来发送 HTTP 请求。
安装 requests
pip install requests
代码示例
import requests
import os
def save_image_from_url(url, save_path):
"""
从给定的URL下载图片并保存到指定路径。
:param url: 图片的URL地址
:param save_path: 保存图片的完整路径(包括文件名)
"""
try:
# 发送 GET 请求
response = requests.get(url, stream=True, timeout=10)
# 确保请求成功 (状态码 200)
response.raise_for_status()
# 确保保存图片的目录存在
os.makedirs(os.path.dirname(save_path), exist_ok=True)
# 以二进制写入模式打开文件
with open(save_path, 'wb') as f:
# 将响应内容分块写入文件,避免内存占用过大
for chunk in response.iter_content(1024):
f.write(chunk)
print(f"图片已成功保存到: {save_path}")
except requests.exceptions.RequestException as e:
print(f"下载图片时出错: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
# --- 使用示例 ---
image_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png" # 一个公开的 Python logo 图片
save_directory = "downloaded_images" # 保存图片的文件夹
image_filename = "python_logo.png"
save_location = os.path.join(save_directory, image_filename)
save_image_from_url(image_url, save_location)
使用 Matplotlib 保存图表(数据可视化)
在数据科学中,我们经常需要将生成的图表(如折线图、散点图)保存为图片文件。
安装 matplotlib
pip install matplotlib
代码示例
import matplotlib.pyplot as plt
import numpy as np
# 1. 创建一些示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 2. 创建图表
plt.figure(figsize=(8, 5)) # 设置图表大小
plt.plot(x, y, label='sin(x)', color='blue')"正弦波图像")
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
plt.grid(True)
plt.legend()
# 3. 保存图表
# dpi (dots per inch) 可以控制图片的分辨率
# bbox_inches='tight' 可以防止标签被截断
plt.savefig("sine_wave.png", dpi=300, bbox_inches='tight')
# 4. (可选) 显示图表
# plt.show()
print("图表已保存为 sine_wave.png")
使用 OpenCV 保存图片(计算机视觉)
OpenCV 是计算机视觉领域的标准库,它也提供了非常高效的图片保存功能,它与 Pillow 的一个重要区别是,OpenCV 默认以 BGR(蓝、绿、红)顺序读取和保存颜色通道,而 Pillow/ Matplotlib 使用 RGB。
安装 opencv-python
pip install opencv-python
代码示例
import cv2
import numpy as np
# 1. 创建一个示例数据(BGR 格式)
# OpenCV 的 NumPy 数组是 (高度, 宽度, 通道)
data_bgr = np.zeros((100, 100, 3), dtype=np.uint8)
data_bgr[:, :, 0] = 255 # 蓝色通道为 255
# 2. 保存图片
# cv2.imwrite() 直接将 NumPy 数组保存为图片文件
# 文件扩展名决定了保存的格式
success = cv2.imwrite('blue_image_opencv.jpg', data_bgr)
if success:
print("图片已成功保存为 blue_image_opencv.jpg")
else:
print("保存图片失败。")
# 3. 从网络读取并保存(需要先安装 requests)
try:
import requests
response = requests.get("https://www.python.org/static/community_logos/python-logo-master-v3-TM.png", timeout=10)
response.raise_for_status()
# 将二进制内容解码为 NumPy 数组
# cv2.imdecode() 用于从内存中的数据读取图片
image_array = np.frombuffer(response.content, dtype=np.uint8)
image_bgr = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
cv2.imwrite("python_logo_opencv.png", image_bgr)
print("网络图片已成功保存为 python_logo_opencv.png")
except ImportError:
print("请先安装 requests 库来运行此部分代码。")
except Exception as e:
print(f"处理网络图片时出错: {e}")
总结与对比
| 库/方法 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
| Pillow | 通用图像处理,从数组创建/保存图片 | API 友好,功能全面,支持多种格式 | 性能不如 OpenCV |
| Requests | 从网络下载图片 | 简单易用,是 HTTP 请求的标准库 | 本身不处理图像,需配合其他库 |
| Matplotlib | 保存数据图表 | 与数据科学生态无缝集成 | 主要用于图表,不适合处理像素级图像 |
| OpenCV | 计算机视觉,高性能图像处理 | 性能极高,功能强大(视频、特征检测等) | 颜色通道为 BGR,有时需要转换 |
如何选择?
- 如果只是简单地保存一个网络图片:使用
requests。 - 如果需要对图片进行通用处理(调整大小、裁剪、滤镜等)或从数据生成图片:使用
Pillow。 - 如果是在做数据分析和可视化,需要保存图表:使用
Matplotlib。 - **如果是在
