杰瑞科技汇

python tuxiangbaocun

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

python tuxiangbaocun-图1
(图片来源网络,侵删)

使用 Pillow 库(最常用)

Pillow 是 Python 图像处理库(PIL)的一个现代分支,功能强大,是处理本地图片、创建新图片并将其保存到文件的首选。

安装 Pillow 如果你的环境中没有安装,需要先安装它:

pip install Pillow

基本用法:从数组创建并保存图片

你可以使用 NumPy 创建一个像素数组,然后用 Pillow 将其保存为图片。

python tuxiangbaocun-图2
(图片来源网络,侵删)
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
  • **如果是在
分享:
扫描分享到社交APP
上一篇
下一篇