imageio,一个图像读写的 Python 库! 一、库的简介实际生活中的作用在平常的工作和生活中图像处理几乎无处不在——用手机拍一张照片是图像刷短视频时每一秒的画面也是图像甚至在医院的 CT 报告里人体器官被一层层切片扫描出来同样离不开图像的读写。这些看似不相关的场景背后都涉及同一个核心问题如何高效地读取、保存、转换各种图像格式。Imageio 正是为解决这个问题而生的 Python 库。它是一个成熟且跨平台的图像 I/O 工具能够轻松读写包括静态图像、动态图像GIF、视频数据、体积数据以及诸多科学格式在内的多种图像数据。它底层依赖 NumPy 和 Pillow上层提供了一套简洁、一致的 API让开发者无需关心具体格式背后的复杂细节。实际生活中Imageio 可以帮助我们解决很多日常问题将一组手机拍摄的延时照片合成一段流畅的视频批量转换相册中的图片格式以节省存储空间甚至从医学 DICOM 文件中读取人体扫描数据用于辅助健康分析。无论是普通用户还是专业开发者Imageio 都能让图像数据“来去自如”。二、安装库Imageio 的安装非常简单因为它是一个纯 Python 库依赖极轻仅需 NumPy 和 Pillow 两个基础库。推荐通过 pip 安装bashpip install imageio如果你使用的是 Anaconda 环境也可以通过 conda 安装bashconda install -c conda-forge imageio安装完成后为了后续使用方便可以额外安装 ffmpeg 插件以增强对视频格式的支持bashpip install imageio-ffmpeg三、基本用法下面我们通过四个小步骤逐步掌握 Imageio 的核心操作。第 1 步读取一张静态图像使用iio.imread()可以读取任意常见格式的图像文件返回的结果是一个 NumPy 数组形状为 (高度, 宽度, 通道数)pythonimport imageio.v3 as iio # 读取图像 image iio.imread(my_photo.jpg) print(f图像形状: {image.shape}) # 例如: (1080, 1920, 3) print(f数据类型: {image.dtype}) # uint8第 2 步查看图像信息NumPy 数组自带 shape 和 dtype 属性可以直接获取图像的尺寸和数据类型。此外也可以通过iio.improps()获取更详细的元数据pythonprops iio.improps(my_photo.jpg) print(f格式: {props.format_id}) print(f图像数量: {props.n_images})第 3 步保存或转换图像格式使用iio.imwrite()可以将 NumPy 数组保存为目标格式。Imageio 会根据文件扩展名自动判断格式python# 将 JPEG 保存为 PNG 格式 iio.imwrite(my_photo.png, image)第 4 步批量读取与处理在实际工作中经常需要批量处理文件夹中的多张图片。结合 os 模块可以轻松实现pythonimport os import imageio.v3 as iio image_folder ./photos/ output_folder ./converted/ for filename in os.listdir(image_folder): if filename.lower().endswith((.png, .jpg, .jpeg)): img iio.imread(os.path.join(image_folder, filename)) # 这里可以对 img 做进一步处理 iio.imwrite(os.path.join(output_folder, filename.rsplit(., 1)[0] .png), img)四、高级用法当需要处理动态图像或视频时Imageio 的高级功能就派上了用场。1. 视频帧读取与逐帧处理iio.imiter()提供了高效的逐帧迭代能力无需一次性将整个视频加载到内存中pythonimport imageio.v3 as iio # 逐帧读取视频 for idx, frame in enumerate(iio.imiter(my_video.mp4)): print(f第 {idx} 帧形状: {frame.shape}) # 在这里对 frame 进行实时处理 if idx 100: # 只处理前 100 帧 break2. 将图像序列写入 GIF 动画从一系列图片生成 GIF是社交媒体内容创作的常见需求pythonimport imageio.v3 as iio import numpy as np # 模拟生成 20 帧渐变色图像 frames [] for i in range(20): frame np.full((200, 200, 3), [i * 12, i * 8, 255 - i * 12], dtypenp.uint8) frames.append(frame) # 保存为 GIF每帧持续 0.1 秒 iio.imwrite(animated.gif, frames, duration100, loop0)3. 视频写入与压缩控制结合iio.imwrite()的参数可以实现对视频编码和质量的精细控制python# 从图像序列生成 MP4 视频30 帧/秒 iio.imwrite(output.mp4, frames, fps30, codeclibx264, quality7)五、实际应用场景场景一延时摄影合成视频拍摄了一组延时照片例如日出过程的 500 张照片需要合成一个流畅的视频pythonimport imageio.v3 as iio import glob # 按文件名称排序读取所有图片 image_files sorted(glob.glob(timelapse/*.jpg)) frames [iio.imread(f) for f in image_files] # 以 24 帧/秒的速度输出视频 iio.imwrite(sunrise.mp4, frames, fps24, quality8) print(f成功合成视频共 {len(frames)} 帧)场景二批量转换医学图像DICOM 格式医学领域广泛使用 DICOM 格式存储 CT、MRI 等扫描数据。Imageio 支持读取 DICOM 文件并可以将其转换为更通用的 PNG 或 JPEG 格式方便后续分析或分享pythonimport imageio.v3 as iio import os def dicom_to_png(dicom_path, output_folder): 将 DICOM 文件转换为 PNG 格式 try: # 读取 DICOM 文件 img iio.imread(dicom_path) # 生成输出文件名保留原始前缀后缀改为 png base_name os.path.basename(dicom_path).rsplit(., 1)[0] output_path os.path.join(output_folder, f{base_name}.png) iio.imwrite(output_path, img) print(f已转换: {dicom_path} - {output_path}) except Exception as e: print(f转换失败 {dicom_path}: {e}) # 批量转换目录中的所有 DICOM 文件 dicom_dir ./dicom_series/ output_dir ./png_output/ os.makedirs(output_dir, exist_okTrue) for file in os.listdir(dicom_dir): if file.endswith(.dcm): dicom_to_png(os.path.join(dicom_dir, file), output_dir)场景三实时摄像头画面捕获带性能优化Imageio 的 FFMPEG 插件支持从摄像头设备实时读取画面流。以下示例展示了如何以恒定帧率捕获摄像头画面同时确保内存不会无限增长pythonimport imageio.v3 as iio import gc from datetime import datetime def capture_webcam(output_filecapture.mp4, duration_sec5, fps30): 从默认摄像头捕获指定时长的视频并确保内存稳定 # 打开摄像头流Linux 下通常为 /dev/video0Windows 下为 0 reader iio.imiter(video0, formatffmpeg, fpsfps, size(640, 480)) frames [] frame_count 0 max_frames duration_sec * fps for frame in reader: frames.append(frame) frame_count 1 # 每捕获 100 帧手动触发垃圾回收防止内存无限制增长 if frame_count % 100 0: gc.collect() if frame_count max_frames: break # 保存捕获的视频 iio.imwrite(output_file, frames, fpsfps, quality7) print(f捕获完成共 {len(frames)} 帧已保存至 {output_file}) if __name__ __main__: capture_webcam()性能提示在使用 Imageio 处理大量图像时注意及时释放不再使用的变量并适时调用gc.collect()触发垃圾回收可以有效避免内存持续增长的问题。此外对于超大视频或图像序列优先使用imiter()进行流式处理而非一次性将全部帧加载到内存。六、结尾互动Imageio 以其简洁的 API、轻量的依赖和覆盖广泛的格式支持成为 Python 图像 I/O 领域的实用工具。无论你是要做简单的图片格式转换、制作个人动态表情包、合成延时视频还是深入处理医学或科研图像数据Imageio 都能让你以几行代码完成任务把精力释放到更核心的业务逻辑上。以上就是关于 Imageio 的核心介绍和一些实用的案例代码。你在日常工作中用过 Imageio 吗有没有遇到过让你印象深刻的图像处理难题或者是巧妙的用法欢迎在评论区分享你的经验和看法大家一起交流进步