图片格式转换
格式简介
1. BMP
- 扩展名:
.bmp
- 类型:无压缩位图格式
- 特点:BMP (Bitmap) 是一种早期的图像格式,通常不使用压缩,因此文件较大。它保留了每个像素的详细信息,适用于简单的图像存储,但不适合用于网络传输,因为文件大小较大。
- 用途:在 Windows 系统中广泛使用,但在互联网和移动设备上已不常见,主要用于保存简单的图像和图标。
2. JPG/JPEG
- 扩展名:
.jpg
,.jpeg
- 类型:有损压缩
- 特点:JPG (Joint Photographic Experts Group) 是一种广泛使用的有损压缩格式,适合保存颜色丰富、细节复杂的照片。它通过有损压缩技术减少文件大小,适合存储图像的视觉内容,而不关心压缩后可能丢失的细节。
- 用途:广泛用于数码摄影、网页图像和社交媒体中。
3. PNG
- 扩展名:
.png
- 类型:无损压缩
- 特点:PNG (Portable Network Graphics) 是一种支持透明度的图像格式,使用无损压缩技术,适合存储图像的精确内容,不会丢失任何数据。它支持 Alpha 通道,可以处理带有透明背景的图像。
- 用途:广泛用于网页图像、图标、图表以及需要透明背景的图像。
4. WEBP
- 扩展名:
.webp
- 类型:有损或无损压缩
- 特点:WebP 是一种现代图像格式,支持有损和无损压缩,文件体积通常比 JPEG 和 PNG 小。它还支持透明度(类似于 PNG)和动画(类似于 GIF)。
- 用途:主要用于网页图像,旨在提供更高效的压缩和更小的文件大小,减少页面加载时间。
5. TIFF
- 扩展名:
.tiff
,.tif
- 类型:无损压缩或不压缩
- 特点:TIFF (Tagged Image File Format) 是一种无损压缩格式,可以存储高质量的图像,通常用于打印和专业摄影领域。它支持多个图层和页面,可以保存丰富的图像数据。
- 用途:广泛用于印刷和专业图像领域,适合需要保持高图像质量的应用场景。
6. ICO
- 扩展名:
.ico
- 类型:无损压缩
- 特点:ICO (Icon) 是 Windows 图标的标准格式,支持多种分辨率和颜色深度的图像。图标文件可以包含不同尺寸和不同颜色的多个图像。
- 用途:用于 Windows 应用程序和网页图标。
7. TGA
- 扩展名:
.tga
- 类型:无损压缩或不压缩
- 特点:TGA(Targa) 是一种图像格式,通常用于图像编辑和计算机图形行业。它支持无损压缩和透明度,并且广泛用于图形设计、游戏和视频制作中。
- 用途:广泛用于游戏图形、电影视觉效果以及图形设计。
8. HEIF
- 扩展名:
.heif
,.heic
- 类型:有损压缩(使用 HEVC 视频编码)
- 特点:HEIF (High Efficiency Image Format) 是一种高效的图像存储格式,采用高效的视频压缩标准 HEVC(High Efficiency Video Coding),比 JPEG 提供更好的压缩率和图像质量。
- 用途:在苹果设备中常见,iOS 设备使用 HEIF 格式存储图像。它通常用于移动设备和存储优化中。
9. AVIF
- 扩展名:
.avif
- 类型:有损压缩
- 特点:AVIF (AV1 Image File Format) 是一种新兴的图像格式,使用 AV1 视频编码标准进行压缩,提供更高的压缩率和更好的图像质量。它比 JPEG 和 WebP 更高效,支持透明度和高动态范围(HDR)。
- 用途:AVIF 格式主要用于网络图像,特别是在优化网页加载速度和图像质量方面有显著优势。
10. RAW
- 扩展名:通常是相机品牌特定的扩展名,如
.cr2
(Canon)、.nef
(Nikon)、.arw
(Sony) - 类型:未处理的图像数据
- 特点:RAW 格式包含来自相机传感器的原始数据,没有经过任何处理,因此保留了更多细节。RAW 文件通常需要专业的图像处理软件进行后期调整。
- 用途:RAW 格式主要用于专业摄影,特别是摄影师需要最大灵活性以便调整曝光、白平衡和其他图像参数。
转换代码
import os
from PIL import Image
import pillow_heif # 注册 HEIF 和 AVIF 支持
# pip install pillow pillow-heif
# sudo apt-get install libheif1
def convert_image(input_path, output_path, output_format, quality=None, resize=None):
"""转换单个图像,并可选地调整图像大小"""
try:
with Image.open(input_path) as img:
# 如果指定了调整大小,则进行调整
if resize:
img = img.resize(resize)
# 将 RGBA 转换为 RGB(处理 JPEG 格式不支持透明度)
if img.mode == 'RGBA' and output_format.lower() in ['jpeg', 'jpg']:
img = img.convert('RGB')
# 格式映射,确保与 Pillow 兼容
format_mapping = {
'jpg': 'JPEG',
'jpeg': 'JPEG',
'tif': 'TIFF',
'tiff': 'TIFF',
'heif': 'HEIF',
'heic': 'HEIF',
'avif': 'AVIF',
}
save_format = format_mapping.get(output_format.lower(), output_format.lower())
# 对于 JPEG 等有损格式,设置质量
if quality and save_format == 'JPEG':
img.save(output_path, format=save_format, quality=quality)
else:
img.save(output_path, format=save_format)
except Exception as e:
print(f"转换 {input_path} 到 {output_path} 时出错: {e}")
def convert_folder(input_folder, output_folder, output_formats, quality=None, resize=None):
"""将文件夹中的所有图像转换为指定格式"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
input_path = os.path.join(input_folder, filename)
if os.path.isfile(input_path):
try:
# 获取文件扩展名,并判断是否为图像文件
_, ext = os.path.splitext(filename)
ext = ext.lower().lstrip('.') # 移除 '.' 并转为小写
# 支持的图像格式列表(不区分大小写)
supported_formats = ['bmp', 'jpg', 'jpeg', 'png', 'webp', 'tiff', 'tif', 'ico', 'tga', 'heif', 'avif', 'heic']
if ext in supported_formats:
for output_format in output_formats:
# 跳过 RAW 格式的保存
if output_format.lower() == 'raw':
continue
output_path = os.path.join(output_folder, f"{os.path.splitext(filename)[0]}_converted.{output_format.lower()}")
convert_image(input_path, output_path, output_format, quality, resize)
else:
print(f"忽略不支持的文件格式: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {e}")
# 示例用法
input_folder = r'/workspace/Python/1' # 输入文件夹路径
output_folder = r'/workspace/Python/2' # 输出文件夹路径
output_formats = ['bmp', 'jpg', 'jpeg', 'png', 'webp', 'tiff', 'tif', 'ico', 'tga', 'heif', 'avif', 'heic', 'raw'] # 13种输出格式
quality = 85 # JPEG 质量(可选)
resize = (800, 600) # 调整大小(可选)
convert_folder(input_folder, output_folder, output_formats, quality, resize)