删除相同大小图像的有效方法
Efficient way to delete image of the same size
我的文件夹中有很多图片,我想删除相同大小的图片。我下面的代码使用 PIL,可以工作,但我想知道是否有更有效的方法来实现这一点。
import os
from PIL import Image
def checkImages(dirs):
image_list = os.listdir(dirs)
for i in range(len(image_list)):
for j in range(i + 1, len(image_list)):
im_a = Image.open(dirs + '/' + image_list[i])
im_b = Image.open(dirs + '/' + image_list[j])
if im_a.size == im_b.size:
os.remove(dirs + '/' + image_list[j])
del image_list[j]
checkImages('/content/gdrive/MyDrive/testdata')
您可以保留一个尺寸字典,并删除任何尺寸已经出现过的图像。这样您就不需要嵌套循环,也不必为同一个文件多次创建 Image 对象。
def checkImages(dirs):
sizes = {}
for file in os.listdir(dirs):
size = Image.open(dirs + '/' + file).size
if size in sizes:
os.remove(dirs + '/' + file)
else:
sizes[size] = file
请看这个Get Image size WITHOUT loading image into memory
您可以使用库 imagesize
import os
import imagesize
def checkImages(dirs):
image_list = os.listdir(dirs)
for i in range(len(image_list)):
for j in range(i + 1, len(image_list)):
im_a=imagesize.get(dirs+'/'+image_list[i])
im_b=imagesize.get(dirs+'/'+image_list[j])
if im_a == im_b:
os.remove(dirs + '/' + image_list[j])
del image_list[j]
checkImages('/content/gdrive/MyDrive/testdata')
我的文件夹中有很多图片,我想删除相同大小的图片。我下面的代码使用 PIL,可以工作,但我想知道是否有更有效的方法来实现这一点。
import os
from PIL import Image
def checkImages(dirs):
image_list = os.listdir(dirs)
for i in range(len(image_list)):
for j in range(i + 1, len(image_list)):
im_a = Image.open(dirs + '/' + image_list[i])
im_b = Image.open(dirs + '/' + image_list[j])
if im_a.size == im_b.size:
os.remove(dirs + '/' + image_list[j])
del image_list[j]
checkImages('/content/gdrive/MyDrive/testdata')
您可以保留一个尺寸字典,并删除任何尺寸已经出现过的图像。这样您就不需要嵌套循环,也不必为同一个文件多次创建 Image 对象。
def checkImages(dirs):
sizes = {}
for file in os.listdir(dirs):
size = Image.open(dirs + '/' + file).size
if size in sizes:
os.remove(dirs + '/' + file)
else:
sizes[size] = file
请看这个Get Image size WITHOUT loading image into memory
您可以使用库 imagesize
import os
import imagesize
def checkImages(dirs):
image_list = os.listdir(dirs)
for i in range(len(image_list)):
for j in range(i + 1, len(image_list)):
im_a=imagesize.get(dirs+'/'+image_list[i])
im_b=imagesize.get(dirs+'/'+image_list[j])
if im_a == im_b:
os.remove(dirs + '/' + image_list[j])
del image_list[j]
checkImages('/content/gdrive/MyDrive/testdata')