前言:
最近有个需求是将tif转出为jpg格式,然而转出的jpg总是会失真,经过多种测试之后发现tifffile转出的jpg能够比较接近的还原图像本身色彩,但是jpg反而还会变大,于是又用pillow进行了压缩。之前尝试过直接用pillow和cv进行转换,图像都会失真。不要直接在tiff图像上进行压缩,这也会导致图像失真。所以优先进行图像格式的转换,再进行压缩。
#tif不失真转换为jpg,但是jpg的大小会增大
import tifffile as tiff
import os
#jpg压缩函数
#tif不失真转换为jpg,但是jpg的大小会增大
def convert_tif_to_jpg(folder_path):
# 获取文件夹下所有文件和子文件夹
for root, dirs, files in os.walk(folder_path):
for file_name in files:
if file_name.endswith('.tif'):
# 构建完整的文件路径
file_path = os.path.join(root, file_name)
# 读取tif文件
img = tiff.imread(file_path)
# 构建保存jpg文件的文件路径
new_file_name = file_name.replace('.tif', '.jpg')
new_file_path = os.path.join(root, new_file_name)
# 将tif文件保存为jpg文件
tiff.imsave(new_file_path, img)
print(f"已将 {file_path} 转换为 {new_file_path}")
print("全部tif文件转换为jpg文件完成")
#不要直接用pillow进行tif格式转换,失真失真失真!!!!!
#本代码中利用pillow进行压缩jpg,会替换原有的jpg文件,请注意备份并根据需求自行修改代码
from PIL import Image
import os
def compress_jpg_images(jpg_folder,quality=90):
#大文件设置
Image.LOAD_TRUNCATED_IMAGES = True
#os.makedirs(compressed_folder, exist_ok=True)
# 获取文件夹下所有文件和子文件夹
for root, dirs, files in os.walk(jpg_folder):
for file in files:
if file.endswith(".jpg"):
jpg_file_path = os.path.join(root, file)
img = Image.open(jpg_file_path)
img = img.convert('RGB') # 将RGBA通道转为RGB
#compressed_file_path = jpg_file_path
img.save(jpg_file_path, quality=quality)
print(f"{jpg_file_path} 已压缩并替换")
print("全部jpg文件压缩完成")
#将除.jpg后缀的文件全都删除
import os
#folder_path,文件夹路径,keep_format,要保留的文件后缀名
def delete_files_except_specified_format(folder_path, keep_format):
# 获取文件夹下所有文件的文件名
file_path=folder_path
for root, dirs, files in os.walk(file_path):
for file in files:
if not file.endswith(".jpg"):
ile_path = os.path.join(root, file)
os.remove(file_path)
print("删除",file_path)
完整代码:
from PIL import Image
import tifffile as tiff
import os
#jpg压缩函数
#tif不失真转换为jpg,但是jpg的大小会增大
def convert_tif_to_jpg(folder_path):
# 获取文件夹下所有文件和子文件夹
for root, dirs, files in os.walk(folder_path):
for file_name in files:
if file_name.endswith('.tif'):
# 构建完整的文件路径
file_path = os.path.join(root, file_name)
# 读取tif文件
img = tiff.imread(file_path)
# 构建保存jpg文件的文件路径
new_file_name = file_name.replace('.tif', '.jpg')
new_file_path = os.path.join(root, new_file_name)
# 将tif文件保存为jpg文件
tiff.imsave(new_file_path, img)
print(f"已将 {file_path} 转换为 {new_file_path}")
print("全部tif文件转换为jpg文件完成")
#jpg_floder,jpg文件所在的文件夹
#quality,压缩质量
def compress_jpg_images(jpg_folder,quality=90):
#大文件设置
Image.LOAD_TRUNCATED_IMAGES = True
#os.makedirs(compressed_folder, exist_ok=True)
# 获取文件夹下所有文件和子文件夹
for root, dirs, files in os.walk(jpg_folder):
for file in files:
if file.endswith(".jpg"):
jpg_file_path = os.path.join(root, file)
img = Image.open(jpg_file_path)
img = img.convert('RGB') # 将RGBA通道转为RGB
#compressed_file_path = jpg_file_path
img.save(jpg_file_path, quality=quality)
print(f"{jpg_file_path} 已压缩并保存为 {compressed_file_path}")
print("全部jpg文件压缩完成")
#folder_path,文件夹路径,keep_format,要保留的文件后缀名
def delete_files_except_specified_format(folder_path, keep_format):
# 获取文件夹下所有文件的文件名
file_path=folder_path
for root, dirs, files in os.walk(file_path):
for file in files:
if not file.endswith(".jpg"):
ile_path = os.path.join(root, file)
os.remove(file_path)
print("删除",file_path)
# 指定存放文件的文件夹路径
folder_path = r'floder_path'
# 调用函数进行转换
convert_tif_to_jpg(folder_path)
# 指定存储 jpg 文件的文件夹路径
jpg_folder = folder_path
# 设置压缩质量
quality = 90
# 调用函数进行压缩,替换原有文件
compress_jpg_images(jpg_folder,quality)
# 指定要保留的文件格式
keep_format = '.jpg'
# 调用函数删除除指定格式文件之外的所有文件
delete_files_except_specified_format(folder_path, keep_format)