tiff转jpg如何不失真

前言:

        最近有个需求是将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)





  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值