2024-08-21 使用python将尼康NEF格式转换为jp

2024-08-20  本文已影响0人  scoot929

前言

日前我买了一个尼康的相机, 使用NEF格式保存照片, 后续又买了一个NAS极空间, 将所有照片放在nas上面, 这样家里面的电视机也可以看到我拍的照片了
可惜的是, 极空间预览照片不支持NEF格式, 只能看到很模糊的缩略图
所以我想将所有照片转换为JPG格式COPY一份放到极空间专门用来预览, NEF用来存档
尝试了一些软件, 发现都不能满足要求, 要么就是要付费
照片的目录都是按照日期分别放到不同的文件夹, 我希望转换出来的照片也是能放到相同的目录
最后决定使用python脚本来开发

我目前的照片存放目录
转换后新生成的照片存放的目录, 只是将pictures替换为pictures-jpg了

方案1: rawpy

rawpy是python很出名的一个库, 专门用来处理各种raw格式的照片,废话不都说, 直接贴代码:

import os

import imageio
import rawpy


def main():
    # 根据老目录创建新目录
    root_path = 'D:\\videoCups\\pictures'
    for root, dirs, files in os.walk(root_path, topdown=True):
        create_path(root)
        for path in dirs:
            total_path = os.path.join(root, path)
            create_path(total_path)
    # 进行图片格式转换
    for root, dirs, files in os.walk(root_path, topdown=True):
        for name in files:
            file = os.path.join(root, name)
            if '.NEF' in file:
                new_file_name = file.replace('.NEF', '.jpg').replace('pictures', 'pictures-jpg')
                if os.path.isfile(new_file_name):    # JPG图片已经存在了则不处理
                    continue
                with rawpy.imread(file) as raw:
                    print(new_file_name)
                    img = raw.postprocess(use_camera_wb=True, no_auto_bright=False)
                    # img = raw.postprocess(use_camera_wb=True)
                    # img = raw.postprocess(use_camera_wb=True, gamma=(2.0, 2.0), dcb_enhance=True)
                    # img = raw.postprocess(gamma=(1, 1), no_auto_bright=True, output_bps=16)
                    imageio.imwrite(new_file_name, img)
                    # Image.fromarray(img).save(new_file_name, quality=100, optimize=True)


def create_path(total_path):
    new_path = total_path.replace('pictures', 'pictures-jpg')
    if not os.path.exists(new_path):
        print('创建新目录' + new_path)
        os.mkdir(new_path)


if __name__ == '__main__':
    main()

经过测试, 这个方案有一个明显的问题, 转换出来的图片颜色失真, 饱和度, 亮度明显不足, 经过多次实验, 最终放弃, 无法达到我的要求

方案2: magick

magick是一个c++库, 直接可以CMD的方式来转换图片, 直接下载exe文件到windows电脑上面, cmd测试

magick

Usage: magick tool [ {option} | {image} ... ] {output_image}
Usage: magick [ {option} | {image} ... ] {output_image}
       magick [ {option} | {image} ... ] -script {filename} [ {script_args} ...]
       magick -help | -version | -usage | -list {option}

magick: invalid argument for option  @ error/magick-cli.c/MagickImageCommand/991.

ImageMagick – 下载链接

import os


def main():
    # 根据老目录创建新目录
    root_path = 'D:\\videoCups\\pictures'
    # os.mkdir('D:\\videoCups\\pictures-jpg')
    for root, dirs, files in os.walk(root_path, topdown=True):
        create_path(root)
        for path in dirs:
            total_path = os.path.join(root, path)
            create_path(total_path)

    for root, dirs, files in os.walk(root_path, topdown=True):
        for name in files:
            file = os.path.join(root, name)
            if '.NEF' in file:
                new_file_name = file.replace('.NEF', '.jpg').replace('pictures', 'pictures-jpg')
                if os.path.isfile(new_file_name):    # JPG图片已经存在了则不处理
                    continue
                cmd = f'magick {file} -colorspace sRGB -quality 100  {new_file_name}'
                print(cmd)
                os.system(cmd)


def create_path(total_path):
    new_path = total_path.replace('pictures', 'pictures-jpg')
    if not os.path.exists(new_path):
        print('创建新目录' + new_path)
        os.mkdir(new_path)


if __name__ == '__main__':
    main()

效果很好!

上一篇 下一篇

猜你喜欢

热点阅读