【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM