Python:批量修改图片的哈希值

为什么要修改图片的哈希值?

上传一个文件到网盘时,网盘会检查该文件的哈希值,如果与网盘服务器上储存的某个文件的哈希值相同,说明该文件已经被上传过了。所以网盘就不会再重复上传,而是直接把以前的那个文件拷贝过来。
同理,如果一张图片在网盘上被和谐了,不管重新上传多少次都会被秒和谐。但是如果更改了图片的哈希值,就相当于变成了另一张图片,就不会因为前科而被和谐了。

如何修改图片的哈希值?

  1. 用Windows自带的画图程序打开一张图片,重新保存它,新图片的哈希值就与原图片不同(猜测是修改了时间戳之类的信息)。
  2. 以前,笔者一直用PhotoShop的“批处理”功能批量修改图片,但是处理速度慢,有时还会碰到图片格式错误。
  3. 现在,笔者发现用Python的PIL库可以更快地批量修改图片。
  • PIL库提供了打开图片、修改图片、保存图片的方法。如下:
img = Image.open(path)
img.save(path, quality=95)
	# 保存图片时的质量最大为100,但是95也看不出差异,而且文件体积更精简

程序逻辑

主流程代码

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

运行结果

Python:批量修改图片的哈希值

源代码

https://github.com/LeoHsiao1/about_search_file/blob/master/resave_image.py