【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
【Python】使用Python处理RAW格式图片,并根据实际情况完成分组打包发送的更多相关文章
- Ubuntu下预览raw格式图片
默认Ubuntu下资源管理器是不可以直接预览raw格式图片的,这就给查看图片带来很大的不便,下面我们就选择安装UFRaw来预览Raw格式图片 1. 首先在terminal安装UFRaw sudo ap ...
- 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)
测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...
- python抓取bing主页背景图片
最初Python2写法: #!/usr/bin/env python # -*- coding:utf-8 -*- # -*- author:nancy -*- # python2抓取bing主页所有 ...
- arp协议分析&python编程实现arp欺骗抓图片
arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...
- Python opencv提取视频中的图片
作者:R语言和Python学堂链接:https://www.jianshu.com/p/e3c04d4fb5f3 这个函数就是本文要介绍的video2frames()函数,功能就是从视频中提取图片,名 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- python 爬虫数据存入csv格式方法
python 爬虫数据存入csv格式方法 命令存储方式:scrapy crawl ju -o ju.csv 第一种方法:with open("F:/book_top250.csv" ...
- python assert 断言详细用法格式
使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
随机推荐
- Python练习_集合和深浅拷贝_day7
1. 1.作业 1.把列表中所有姓周的人的信息删掉(升级题:此题有坑, 请慎重): lst = ['周老二', '周星星', '麻花藤', '周扒皮'] 结果: lst = ['麻花藤'] 2.车牌区 ...
- Python 生成动态变量 调用动态变量
动态生成变量: variable = locals() for i in range(10): variable['A'+str(i)] = 123 print(A8) 调用动态变量: v = loc ...
- 基于【 Docker】四 || Docker常用镜像安装
一.nginx安装 1.拉取镜像:docker pull nginx 2.启动容器:docker run -d -p 80:80 nginx 3.查看nginx:ps aux | grep 'ngin ...
- 六、TreeMap的使用 及其源码解析
TreeMap中的元素默认按照keys的自然排序排列 1. 构造函数TreeMap(): 创建一个空的TreeMap ,keys按照自然排序TreeMap(Comparator comparator) ...
- MyCAT详解【转】
原文链接:MyCAT详解 作者:Rangle 一.MyCAT概述MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离.分片的分布式中间件.MyCAT可不但支持Oracle.MSSQL.MY ...
- Button控件的三种点击事件
①在布局文件中指定onClick属性的方法设置点击事件 ②使用匿名内部类的方法设置点击事件 ③实现Activity实现OnClickListen接口的方式设置点击事件 linear.xml文件 < ...
- Computer Vision_33_SIFT:Object recognition from local scale-invariant features——1999
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- c# Format() 方法
- CentOS7使用Qemu模拟ARM64
准备 RPM包安装 yum安装交叉编译工具 yum install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu bison flex gli ...
- 模块化开发之sea.js
随着时间的推移,原生js越来越强大,es6中的improt,export已经可以实现模块化开发,但可惜的是现在的浏览器还不支持,需要进行编译,相信在不久的将来,一定会大行其道,今天我们来聊聊模块化开发 ...