契机:
项目中图片过多,导致太大,找到相同图片,减少项目大小(快来帮我看看,为啥我的“hello world ”有一个G)
思路:
1.百度上一堆都是找相识图片(计算hash的偏差),我试过了,计算的图片哈希值偏差设置成0也不是相同图片(好像,是为了提高速度,他们首先将图片进行的缩减,还有的使用灰度处理)等等,效果极其不好(找相同图片不好,找相似还不错)
2.我就开始,想找相同文件,利用文件MD5,但测试后明显不行,美术就是导不同的文件出来(即使内容相同),MD5也是不同,这只能找到(有程序在不同地方存放相同文件)
3.我开始想读取图片的值直接进行对比,效果是我想要的,就是可能运行的比较慢
使用的方法:
python3 xxx.py(下面的Python文件) file(你项目的文件夹)
结果:
会在你的文件夹下,生成一个表格,表格内有相同图片的信息
需要安装什么库,自己看着安装吧(xlwt和PIl),我装太多了,没有安装库,就可以了
新增:
感觉使用md5解决使用了相同文件就行了,没必要把全部相同图片找出来,,,有空重新写下加上,,因为发现美术动画会有一定的相同图片,,,只要保证不同程序导入图片时,别导入相同文件,就能省下不少空间
import os
import sys
from PIL import Image,ImageDraw,ImageFile
import xlwt
# 图片集合
list = []
list2 = []
def compare_image_with_hash():
# 设置表格横列
b = 0
book_name_xls = sys.argv[1] + ".xls"
workbook = xlwt.Workbook() # 新建一个工作簿
sheet = workbook.add_sheet("itme")
for i in range(len(list)):
pd = True
if list2[i] :
continue
for j in range(i+1,len(list)):
if list2[j] :
continue
if compare_image(list[i], list[j]):
if pd :
pd = False
print(list[i])
print("相同的图片")
sheet.write(b, 0, list[i]) # 向表格中写入数据(对应的行和列)
sheet.write(b, 1, "相同的图片") # 向表格中写入数据(对应的行和列)
b = b + 1
list2[j] = True
print(list[j])
sheet.write(b, 1, list[j]) # 向表格中写入数据(对应的行和列)
b = b + 1
if bool(1 - pd) :
print("结束")
workbook.save(book_name_xls) # 保存工作簿
# 完全相同的图片
def compare_image(img_file1, img_file2):
if img_file1 == img_file2:
return True
fp1 = open(img_file1, 'rb')
fp2 = open(img_file2, 'rb')
img1 = Image.open(fp1)
img2 = Image.open(fp2)
ImageFile.LOAD_TRUNCATED_IMAGES = True
b = img1 == img2
fp1.close()
fp2.close()
return b
# 读取文件
def list_all(dir_name):
for dirpath, dirnames, filenames in os.walk(dir_name):
for filename in filenames:
src_path = dirpath + '/' + filename
suffix = filename[-4:]
if suffix != '.png' :
continue
list.append(src_path)
list2.append(False)
# compare_image_with_hash(src_path, dir_name)
compare_image_with_hash()
if __name__ == '__main__':
if len(sys.argv) == 1:
print('must has name dir')
exit(-1)
if len(sys.argv) >= 2:
list_all(sys.argv[1])