• 【Python】使用Python处理RAW格式图片,并根据实际情况完成分组打包发送


    背景

    出游之后,朋友交换的照片格式大多是RAW格式,一些人想要JPG格式,但是百度云盘非会员的下载速度惨不忍睹,所以我想着通过微信群直接传(这个在事后也被证实不能完全解决问题,微信限制了每天传递文件的上限)。
    出游之后,交换的照片格式大多是RAW格式,一些朋友想要JPG,因为百度云盘非会员的下载速度惨不忍睹,且受限于微信单文件100M,所以写了个Python脚本直接转换图片并进行打包发送。
    下面的这个是在此过程中写的Python脚本,完成RAW格式图片的转换,并根据文件大小创建文件夹(微信的单文件大小为100M)进行打包发送。

    库依赖

    安装方法
    Python3
    rawpy pip install rawpy
    imageio pip install imageio

    rawpy的postprocess函数有很多方法,在文末附录中已给出,大家可以根据实际需要进行使用。

    实际代码

    import rawpy
    import glob
    import os
    import imageio
    import shutil
    import zipfile
    
    
    def raw2jpg(raw_file_name, dst="Temp_JPG", _suffix=".NEF"):
        """
        :param raw_file_name:
        :param dst: 存储目录
        :param _suffix: 文件后缀
        :return:
        """
        with rawpy.imread(raw_file_name) as raw:
            im = raw.postprocess(
                use_camera_wb=True,  # 是否使用拍摄时的白平衡值
                use_auto_wb=False,
                # half_size=True,  # 是否输出一半大小的图像,通过将每个2x2块减少到一个像素而不是进行插值来
                exp_shift=3  # 修改后光线会下降,所以需要手动提亮,线性比例的曝光偏移。可用范围从0.25(变暗2级)到8.0(变浅3级)。
            )
            imageio.imsave(dst + raw_file_name.strip(_suffix) + ".jpg", im)  # 因为glob函数返回的是一个相对路径,所以不需要使用os.path
    
    
    def files2zip(files, _extra=".jpg", dst_zip_size=30):
        """
        :param files: 文件夹信息
        :param _extra: 后缀
        :param dst_zip_size:  目标文件大小,实际转换时会 * 0.8 防止大小溢出
        :return:
        """
        init_folder_num = 0
        folder_size = len(files)
        avg_file_size = sum([os.path.getsize(i) / float(1024 * 1024) for i in files]) / folder_size  # 计算转换后文件平均大小
        _split_num = int(dst_zip_size * 0.8 // avg_file_size)  # 计算切割的文件个数, 因为是平均值,* 0.8 防止溢出
    
        # 创建文件夹
        for i in range(folder_size // _split_num + 1):
            os.makedirs(f"Dst/part{i}", int("755", 8))  # 十进制转变为八进制
    
        # 移动文件
        for i in range(folder_size):
            if (folder_size - i) % _split_num:
                # shutil.move(JPG[i], f"Dst/part{init_folder_num}")
                shutil.copy(files[i], f"Dst/part{init_folder_num}")
                continue
            init_folder_num += 1
            # shutil.move(JPG[i], f"Dst/part{init_folder_num}")
            shutil.copy(files[i], f"Dst/part{init_folder_num}")
    
        # zip 打包
        for i in range(folder_size // _split_num + 1):
            folder_name = f"Dst/part{i}"
            z = zipfile.ZipFile(f"{folder_name}.zip", 'w')
            files = glob.glob(os.path.join(f"{folder_name}", f"*{_extra}"))
            for _file in files:
                z.write(_file)
    
    
    src_suffix = ".NEF"
    dst_suffix = ".jpg"
    raw_files = glob.glob(f"NEF/*{src_suffix}")
    
    print("正在转换中,请耐心等待....")
    for num, raw_file in enumerate(raw_files):
        if num % 5 == 0: print(f"已转换{num}张照片...")
        raw2jpg(raw_file, _suffix=src_suffix)
    
    print("转换完成!")
    
    JPGs = glob.glob(f"Temp_JPG/*{dst_suffix}")  # 获取转换后的文件信息
    
    files2zip(JPGs)
    print("所有数据保留在Dst目录,请前往查看!")
    print("Done!")
    

    附录

    参数 含义
    demosaic_algorithm(rawpy.DemosaicAlgorithm) 默认为AHD
    half_size(bool) 通过将每个2x2块减少到一个像素而不是进行插值来输出一半大小的图像
    four_color_rgb(bool) 是否对两个绿色通道使用单独的插值
    dcb_iterations(int) DCB校正通过的次数,需要DCB去马赛克算法
    dcb_enhance(bool) 具有增强的插值颜色的DCB插值
    fbdd_noise_reduction(rawpy.FBDDNoiseReductionMode) 在去马赛克之前控制FBDD降噪
    noise_thr(float) 小波去噪的阈值(默认禁用)
    mean_filter_passes(int) 去马赛克后减少颜色伪像的中间滤波器通过次数
    use_camera_wb(bool) 是否使用拍摄时的白平衡值
    use_auto_wb(bool) 是否尝试自动计算白平衡
    user_wb(list) 长度4的列表,每种颜色都有白平衡倍增器
    output_color(rawpy.ColorSpace) 输出颜色空间
    output_bps(int) 8或16
    user_flip(int) 0 =无,3 = 180、5 = 90CCW,6 = 90CW,默认为使用RAW图像的图像方向(如果可用)
    user_black(int) 自定义黑电平
    user_sat(int) 饱和度调整
    no_auto_scale(bool) 是否禁用像素值缩放
    no_auto_bright(bool) 是否禁用自动增加亮度
    auto_bright_thr(float) 使用自动亮度增加时裁剪的像素比率(请参见no_auto_bright)。默认值为0.01(1%)。
    Adjust_maximum_thr(float) 请参阅libraw文档
    明亮(浮动) 亮度缩放
    highlight_mode(rawpy.HighlightMode int)
    exp_shift(float) 线性比例的曝光偏移。可用范围从0.25(变暗2级)到8.0(变浅3级)。
    exp_preserve_highlights(float) 使用exp_shift增亮图像时保留高光。从0.0到1.0(完全保留)。
    伽玛(元组) 对(幂,斜率),默认为(2.222,4.5)。BT.709
    chromatic_aberration(元组) 对(red_scale,blue_scale),默认是(1,1),通过缩放红色和蓝色通道校正色像差
    bad_pixels_path(str) dcraw坏像素文件的路径。每个坏像素将使用相邻像素的平均值进行校正。参见rawpy.enhance模块以了解其他修复算法,例如使用中位数。

    参考文档:
    https://github.com/letmaik/rawpy

  • 相关阅读:
    Win10系统下安装Tensorflow
    基于theano的深度卷积神经网络
    卷积层和池化层
    ReLu(Rectified Linear Units)激活函数
    向上取整&向下取整
    物品选取
    猫狗大战
    田忌赛马
    魔术棋子
    回文字串
  • 原文地址:https://www.cnblogs.com/Detector/p/12009657.html
Copyright © 2020-2023  润新知