JPEG
,全称Joint Photographic Experts Group,有损压缩格式
PNG
,全称Portable Network Graphic Format,可移植网络图形格式、无损压缩格式
重复保存而不降低图像质量(所以,只要不是需要动画效果的地方强烈建议都采用PNG
格式图片)
jpeg是有损压缩,png是无损的。正因如此,同一图像质量,png文件的大小,大于jpeg文件。
png支持透明效果(alpha),jpeg不支持。
1)经评论区提醒,更新了一下代码,现在能实现
cv2
和PIL
两种方式批量转换图像格式,我个人建议还是采用PIL
的方式比较好,消除Eixf信息
2)试了一下,cv2转的图像大小比PIL小,甚至比原始图像小,而且快。但是我还是选择PIL转
3)比较之下,转换之后的png图像大小都比原本的jpg大,而且cv2
转的png比PIL
转的大
批量实现将input_path中的jpg文件转为png保存至out_path中,主要思想是:(同理可实现其他图像格式的互转,可参考博文:通过PIL模块批量对图片格式进行转换(如jpg转png))
PIL.Image.open()
读取图像数据,注意要消除Exif信息(代码已实现)img.save('xx.png')
保存为固定图像格式(如png)import os
import shutil
import cv2
from PIL import Image, ImageOps
def transform(input_dir, output_dir):
if not os.path.exists(output_dir): # 输出文件见不存在则创建
os.makedirs(output_dir)
for root, dirs, files in os.walk(input_dir):
for file in files: # 只对文件进行更改
filepath = os.path.join(root, file)
filename, ext = os.path.splitext(file) # 分割出图像名称、后缀
if ext != '.png': # 如果后缀不是png,则进行转换
newfile = filename + '.png' # 后缀改为png
print('transform ' + file)
# -------------cv2 更改为PNG的方式------------------------------- #
# image = cv2.imread(filepath)
# cv2.imwrite(os.path.join(output_dir, newfile), image)
# -------------PIL更改为PNG的方式 图像大小比cv的低----------------- #
image = Image.open(filepath)
image = ImageOps.exif_transpose(image) # 消除相机的exif信息
image.save(os.path.join(output_dir, newfile))
else: # 直接拷贝过去
shutil.copy(filepath, os.path.join(output_dir, file))
if __name__ == '__main__':
input_dir = 'images' # 目标文件夹
output_dir = 'images_2' # 输出文件夹
if not os.path.exists(input_dir):
print("文件夹不存在!")
else:
print("Start to transform!")
transform(input_dir, output_dir)
print("Transform end!")