Мне нужно проверить размеры изображений в каталоге. В настоящее время он имеет ~ 700 изображений. Мне просто нужно проверить размеры, и если размер не соответствует заданному размеру, он будет перемещен в другую папку. Как мне начать?
Как проверить размеры всех изображений в каталоге с помощью python?
Ответ 1
Вы можете использовать Python Imaging Library (aka PIL), чтобы читать заголовки изображений и запрашивать размеры.
Один из способов приблизиться к ней - написать себе функцию, которая принимает имя файла и возвращает размеры (используя PIL). Затем используйте функцию os.path.walk
для перемещения всех файлов в каталоге, применяя эту функцию. Собирая результаты, вы можете построить словарь сопоставлений filename -> dimensions
, а затем использовать понимание списка (см. itertools
), чтобы отфильтровать те, которые не соответствуют требуемому размеру.
Ответ 2
Если вам не нужна остальная часть PIL и вам просто нужны размеры изображений PNG, JPEG и GIF, тогда эта небольшая функция (лицензия BSD) прекрасно выполняет работу:
http://code.google.com/p/bfg-pages/source/browse/trunk/pages/getimageinfo.py
import StringIO
import struct
def getImageInfo(data):
data = str(data)
size = len(data)
height = -1
width = -1
content_type = ''
# handle GIFs
if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'):
# Check to see if content_type is correct
content_type = 'image/gif'
w, h = struct.unpack("<HH", data[6:10])
width = int(w)
height = int(h)
# See PNG 2. Edition spec (http://www.w3.org/TR/PNG/)
# Bytes 0-7 are below, 4-byte chunk length, then 'IHDR'
# and finally the 4-byte width, height
elif ((size >= 24) and data.startswith('\211PNG\r\n\032\n')
and (data[12:16] == 'IHDR')):
content_type = 'image/png'
w, h = struct.unpack(">LL", data[16:24])
width = int(w)
height = int(h)
# Maybe this is for an older PNG version.
elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'):
# Check to see if we have the right content type
content_type = 'image/png'
w, h = struct.unpack(">LL", data[8:16])
width = int(w)
height = int(h)
# handle JPEGs
elif (size >= 2) and data.startswith('\377\330'):
content_type = 'image/jpeg'
jpeg = StringIO.StringIO(data)
jpeg.read(2)
b = jpeg.read(1)
try:
while (b and ord(b) != 0xDA):
while (ord(b) != 0xFF): b = jpeg.read(1)
while (ord(b) == 0xFF): b = jpeg.read(1)
if (ord(b) >= 0xC0 and ord(b) <= 0xC3):
jpeg.read(3)
h, w = struct.unpack(">HH", jpeg.read(4))
break
else:
jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2)
b = jpeg.read(1)
width = int(w)
height = int(h)
except struct.error:
pass
except ValueError:
pass
return content_type, width, height
Ответ 3
Один общий способ - использовать PIL, библиотеку изображений python, чтобы получить размеры:
from PIL import Image
import os.path
filename = os.path.join('path', 'to', 'image', 'file')
img = Image.open(filename)
print img.size
Затем вам нужно зациклиться на файлах в вашем каталоге, проверить размеры в соответствии с вашими требуемыми размерами и переместить те файлы, которые не соответствуют.
Ответ 4
Вот script, который делает то, что вам нужно:
#!/usr/bin/env python
"""
Get information about images in a folder.
"""
from os import listdir
from os.path import isfile, join
from PIL import Image
def print_data(data):
"""
Parameters
----------
data : dict
"""
for k, v in data.items():
print("%s:\t%s" % (k, v))
print("Min width: %i" % data['min_width'])
print("Max width: %i" % data['max_width'])
print("Min height: %i" % data['min_height'])
print("Max height: %i" % data['max_height'])
def main(path):
"""
Parameters
----------
path : str
Path where to look for image files.
"""
onlyfiles = [f for f in listdir(path) if isfile(join(path, f))]
# Filter files by extension
onlyfiles = [f for f in onlyfiles if f.endswith('.jpg')]
data = {}
data['images_count'] = len(onlyfiles)
data['min_width'] = 10**100 # No image will be bigger than that
data['max_width'] = 0
data['min_height'] = 10**100 # No image will be bigger than that
data['max_height'] = 0
for filename in onlyfiles:
im = Image.open(filename)
width, height = im.size
data['min_width'] = min(width, data['min_width'])
data['max_width'] = max(width, data['max_height'])
data['min_height'] = min(height, data['min_height'])
data['max_height'] = max(height, data['max_height'])
print_data(data)
if __name__ == '__main__':
main(path='.')
Ответ 5
Я в значительной степени удовлетворен приведенными выше ответами, поскольку они помогли мне написать еще один простой ответ на этот вопрос.
Поскольку в приведенном выше ответе есть только сценарии, поэтому читателям необходимо запустить их, чтобы проверить, работают ли они нормально или нет. Поэтому я решил решить проблему, используя интерактивное программирование (из оболочки Python).
Я думаю, вам будет ясно. Я использую Python 2.7.12, и я установил библиотеку Pillow, чтобы использовать PIL для доступа к изображениям. В моем текущем каталоге есть много jpg-магов и 1 png-изображение.
Теперь перейдем к оболочке Python.
>>> #Date of creation : 3 March 2017
>>> #Python version : 2.7.12
>>>
>>> import os #Importing os module
>>> import glob #Importing glob module to list the same type of image files like jpg/png(here)
>>>
>>> for extension in ["jpg", 'png']:
... print "List of all "+extension+" files in current directory:-"
... i = 1
... for imgfile in glob.glob("*."+extension):
... print i,") ",imgfile
... i += 1
... print "\n"
...
List of all jpg files in current directory:-
1 ) 002-tower-babel.jpg
2 ) 1454906.jpg
3 ) 69151278-great-hd-wallpapers.jpg
4 ) amazing-ancient-wallpaper.jpg
5 ) Ancient-Rome.jpg
6 ) babel_full.jpg
7 ) Cuba-is-wonderfull.jpg
8 ) Cute-Polar-Bear-Images-07775.jpg
9 ) Cute-Polar-Bear-Widescreen-Wallpapers-07781.jpg
10 ) Hard-work-without-a-lh.jpg
11 ) jpeg422jfif.jpg
12 ) moscow-park.jpg
13 ) moscow_city_night_winter_58404_1920x1080.jpg
14 ) Photo1569.jpg
15 ) Pineapple-HD-Photos-03691.jpg
16 ) Roman_forum_cropped.jpg
17 ) socrates.jpg
18 ) socrates_statement1.jpg
19 ) steve-jobs.jpg
20 ) The_Great_Wall_of_China_at_Jinshanling-edit.jpg
21 ) torenvanbabel_grt.jpg
22 ) tower_of_babel4.jpg
23 ) valckenborch_babel_1595_grt.jpg
24 ) Wall-of-China-17.jpg
List of all png files in current directory:-
1 ) gergo-hungary.png
>>> #So let display all the resolutions with the filename
... from PIL import Image #Importing Python Imaging library(PIL)
>>> for extension in ["jpg", 'png']:
... i = 1
... for imgfile in glob.glob("*."+extension):
... img = Image.open(imgfile)
... print i,") ",imgfile,", resolution: ",img.size[0],"x",img.size[1]
... i += 1
... print "\n"
...
1 ) 002-tower-babel.jpg , resolution: 1024 x 768
2 ) 1454906.jpg , resolution: 1920 x 1080
3 ) 69151278-great-hd-wallpapers.jpg , resolution: 5120 x 2880
4 ) amazing-ancient-wallpaper.jpg , resolution: 1920 x 1080
5 ) Ancient-Rome.jpg , resolution: 1000 x 667
6 ) babel_full.jpg , resolution: 1464 x 1142
7 ) Cuba-is-wonderfull.jpg , resolution: 1366 x 768
8 ) Cute-Polar-Bear-Images-07775.jpg , resolution: 1600 x 1067
9 ) Cute-Polar-Bear-Widescreen-Wallpapers-07781.jpg , resolution: 2300 x 1610
10 ) Hard-work-without-a-lh.jpg , resolution: 650 x 346
11 ) jpeg422jfif.jpg , resolution: 2048 x 1536
12 ) moscow-park.jpg , resolution: 1920 x 1200
13 ) moscow_city_night_winter_58404_1920x1080.jpg , resolution: 1920 x 1080
14 ) Photo1569.jpg , resolution: 480 x 640
15 ) Pineapple-HD-Photos-03691.jpg , resolution: 2365 x 1774
16 ) Roman_forum_cropped.jpg , resolution: 4420 x 1572
17 ) socrates.jpg , resolution: 852 x 480
18 ) socrates_statement1.jpg , resolution: 1280 x 720
19 ) steve-jobs.jpg , resolution: 1920 x 1080
20 ) The_Great_Wall_of_China_at_Jinshanling-edit.jpg , resolution: 4288 x 2848
21 ) torenvanbabel_grt.jpg , resolution: 1100 x 805
22 ) tower_of_babel4.jpg , resolution: 1707 x 956
23 ) valckenborch_babel_1595_grt.jpg , resolution: 1100 x 748
24 ) Wall-of-China-17.jpg , resolution: 1920 x 1200
1 ) gergo-hungary.png , resolution: 1236 x 928
>>>
Ответ 6
Вы также можете использовать библиотеку cv2 для проверки размеров изображений.
import cv2
# read image
img = cv2.imread('boarding_pass.png', cv2.IMREAD_UNCHANGED)
# get dimensions of image
dimensions = img.shape
# height, width, number of channels in image
height = img.shape[0]
width = img.shape[1]
channels = img.shape[2]
print('Image Dimension : ',dimensions)
print('Image Height : ',height)
print('Image Width : ',width)
print('Number of Channels : ',channels)
Ответ 7
import os from PIL import Image folder_images = "/tmp/photos" size_images = dict() for dirpath, _, filenames in os.walk(folder_images): for path_image in filenames: image = os.path.abspath(os.path.join(dirpath, path_image)) with Image.open(image) as img: width, heigth = img.size SIZE_IMAGES[path_image] = {'width': width, 'heigth': heigth} print(size_images)
В folder_images
вы стремитесь к каталогу, в котором он изображен.
size_images
- это переменная с размером изображений в этом формате.
Example {'image_name.jpg' : {'width': 100, 'heigth': 100} }