Ich muss die Abmessungen von Bildern in einem Verzeichnis überprüfen. Derzeit hat es ~ 700 Bilder. Ich muss nur die Größen überprüfen, und wenn die Größe nicht mit einer bestimmten Dimension übereinstimmt, wird es in einen anderen Ordner verschoben. Wie fange ich an?Wie überprüft man die Dimensionen aller Bilder in einem Verzeichnis mit Python?
Antwort
Sie können die Python Imaging Library (aka PIL) verwenden, um die Bildüberschriften zu lesen und die Dimensionen abzufragen.
Eine Möglichkeit, es zu erreichen, wäre, sich eine Funktion zu schreiben, die einen Dateinamen annimmt und die Dimensionen zurückgibt (mit PIL). Verwenden Sie dann die Funktion os.path.walk
, um alle Dateien im Verzeichnis zu durchlaufen, indem Sie diese Funktion anwenden. Sammeln Sie die Ergebnisse, können Sie ein Verzeichnis der Zuordnungen erstellen filename -> dimensions
, dann verwenden Sie eine Liste Verständnis (siehe itertools
), um diejenigen herauszufiltern, die nicht die erforderliche Größe entsprechen.
Eine gängige Methode ist PIL, die Python Imaging-Bibliothek zu verwenden, um die Dimensionen zu erhalten:
from PIL import Image
import os.path
filename = os.path.join('path', 'to', 'image', 'file')
img = Image.open(filename)
print img.size
Dann sind Sie über die Dateien in Ihrem Verzeichnis Schleife müssen, überprüfen Sie die Dimensionen gegen Ihre erforderlichen Abmessungen und Bewegung diese Dateien, die nicht übereinstimmen.
Wenn Sie nicht brauchen, um den Rest von PIL und wollen einfach nur Bildabmessungen von PNG, JPEG und GIF dann diese kleine Funktion (BSD-Lizenz) macht den Job gut:
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
Das funktioniert für mich wie ein Zauber, +1 für eine Lösung ohne 3rd Party Libraries. – Mercury
Hier ist ein Skript, das das tut, was Sie brauchen:
#!/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='.')
Ich bin ziemlich zufrieden mit den oben angegebenen Antworten, da diese mir geholfen haben, eine weitere einfache Antwort dafür zu schreiben Frage.
Da die obige Antwort nur Skripte haben, müssen die Leser laufen, um diese zu überprüfen, ob sie gut funktionieren oder nicht. Also entschied ich mich, das Problem mit einer interaktiven Modus-Programmierung (aus der Python-Shell) zu lösen.
Ich denke, es wird Ihnen klar sein. Ich benutze Python 2.7.12 und ich habe installiert Kissen Bibliothek PIL für den Zugriff auf Bilder zu verwenden.Ich habe eine Menge von JPG Mages und 1 PNG Bild in meinem aktuellen Verzeichnis.
Kommen wir nun zur Python-Shell.
>>> #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's 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
>>>
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)
In folder_images
arrow Sie Verzeichnis, in dem es imagens ist. size_images
ist eine Variable mit der Größe der Bilder, in diesem Format.
Example {'image_name.jpg' : {'width': 100, 'heigth': 100} }
Während die Idee hinter Ihrem Code gut ist, fehlt eine Erklärung. Ich werde auch darauf hinweisen, dass Variablen, die in Großbuchstaben geschrieben sind, normalerweise für Konstanten verwendet werden. Daher wäre es nicht empfehlenswert, sie für ein Diktat wie "SIZE_IMAGES" zu verwenden. – PLPeeters
Bitte, ich könnte meine Antwort neu bewerten. –
Ich habe dies aber mit os.listdir stattdessen .. funktioniert ziemlich gut mit ~ 700 Bildern. Ist os.path.walk besser? – john2x
Wenn 'os.listdir' tut, was Sie brauchen, ist das in Ordnung. Der Hauptunterschied besteht darin, dass "os.walk" in Unterverzeichnisse zurückspringt. – gavinb