Python:批量修改图片的哈希值
为什么要修改图片的哈希值?
上传一个文件到网盘时,网盘会检查该文件的哈希值,如果与网盘服务器上储存的某个文件的哈希值相同,说明该文件已经被上传过了。所以网盘就不会再重复上传,而是直接把以前的那个文件拷贝过来。
同理,如果一张图片在网盘上被和谐了,不管重新上传多少次都会被秒和谐。但是如果更改了图片的哈希值,就相当于变成了另一张图片,就不会因为前科而被和谐了。
如何修改图片的哈希值?
- 用Windows自带的画图程序打开一张图片,重新保存它,新图片的哈希值就与原图片不同(猜测是修改了时间戳之类的信息)。
- 以前,笔者一直用PhotoShop的“批处理”功能批量修改图片,但是处理速度慢,有时还会碰到图片格式错误。
- 现在,笔者发现用Python的PIL库可以更快地批量修改图片。
- PIL库提供了打开图片、修改图片、保存图片的方法。如下:
img = Image.open(path)
img.save(path, quality=95)
# 保存图片时的质量最大为100,但是95也看不出差异,而且文件体积更精简
程序逻辑
-
第一步:定义一个函数,实现检索某个目录下(包括子目录)的所有图片的功能。
参考:https://blog.****.net/qq_35952638/article/details/88399955 -
第二步:打开每张图片,用PIL库处理,再保存到当前目录。
主流程代码
from PIL import Image
from utils.use_io import Inputs
from utils.use_os import searchFile
def main():
# 提示用户输入
print("该程序用于检索指定目录(包括子目录)下的所有.jpg图片,将它们另存到当前目录。")
Inputs.path = Inputs.input_path("请输入要检索的目录:")
Inputs.suffix = ".jpg"
print("检索所有图片...")
file_list = searchFile(Inputs.path, Inputs.suffix)
# 创建一个保存被修改图片的文件夹
result_dir = "modified_images"
if os.path.isdir(result_dir) != True:
os.mkdir(result_dir)
print("开始修改...")
for path in file_list:
try:
img = Image.open(path)
# 可能有些图片只是后缀名为jpg,实际上却不是RGB模式,这里把它们都转换成RGB模式
if img.mode != "RGB":
img = img.convert("RGB")
result_path = os.path.join(result_dir, os.path.basename(path))
img.save(result_path, quality=95) # 保存图片
print("已处理:{}".format(path))
except:
print("未能成功修改图片:{}".format(path))
traceback.print_exc()
print("\n已全部完成。\n")
return 0
运行结果
源代码
https://github.com/LeoHsiao1/about_search_file/blob/master/resave_image.py