2024-08-21 使用python将尼康NEF格式转换为jp
2024-08-20 本文已影响0人
scoot929
前言
日前我买了一个尼康的相机, 使用NEF格式保存照片, 后续又买了一个NAS极空间, 将所有照片放在nas上面, 这样家里面的电视机也可以看到我拍的照片了
可惜的是, 极空间预览照片不支持NEF格式, 只能看到很模糊的缩略图
所以我想将所有照片转换为JPG格式COPY一份放到极空间专门用来预览, NEF用来存档
尝试了一些软件, 发现都不能满足要求, 要么就是要付费
照片的目录都是按照日期分别放到不同的文件夹, 我希望转换出来的照片也是能放到相同的目录
最后决定使用python脚本来开发
我目前的照片存放目录
- D:\videoCups\pictures\
- 2022\
- 2022-01-01\
- 2022-01-08\
- 2023\
- 2022-03-05\
- 2022-05-08\
- 2022\
转换后新生成的照片存放的目录, 只是将pictures替换为pictures-jpg了
- D:\videoCups\pictures-jpg\
- 2022\
- 2022-01-01\
- 2022-01-08\
- 2023\
- 2022-03-05\
- 2022-05-08\
- 2022\
方案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.
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()
效果很好!