2009-10-01 9 views
11

मुझे निर्देशिका में छवियों के आयामों की जांच करने की आवश्यकता है। वर्तमान में इसमें ~ 700 छवियां हैं। मुझे बस आकारों की जांच करने की आवश्यकता है, और यदि आकार किसी दिए गए आयाम से मेल नहीं खाता है, तो इसे एक अलग फ़ोल्डर में ले जाया जाएगा। मैं कैसे शुरू करूँ?पायथन का उपयोग कर निर्देशिका में सभी छवियों के आयामों की जांच कैसे करें?

उत्तर

5

आप छवि शीर्षलेख पढ़ने और आयामों को क्वेरी करने के लिए Python Imaging Library (उर्फ पीआईएल) का उपयोग कर सकते हैं।

इसे देखने का एक तरीका स्वयं को एक ऐसा फ़ंक्शन लिखना होगा जो फ़ाइल नाम लेता है और आयाम लौटाता है (पीआईएल का उपयोग करके)। फिर इस फ़ंक्शन को लागू करने, निर्देशिका में सभी फ़ाइलों को पार करने के लिए os.path.walk फ़ंक्शन का उपयोग करें। परिणामों को एकत्रित करते हुए, आप filename -> dimensions मैपिंग का एक शब्दकोश बना सकते हैं, फिर आवश्यक आकार से मेल खाने वाले लोगों को फ़िल्टर करने के लिए एक सूची समझ (itertools देखें) का उपयोग करें।

from PIL import Image 
import os.path 

filename = os.path.join('path', 'to', 'image', 'file') 
img = Image.open(filename) 
print img.size 

तो फिर आप अपने निर्देशिका में फ़ाइलों पर पाश की जरूरत है, अपने आवश्यक आयाम के खिलाफ आयामों की जांच, और कदम:

+0

मैंने ऐसा किया लेकिन इसके बजाय os.listdir .. ~ 700 छवियों के साथ बहुत अच्छी तरह से काम करता है। क्या os.path.walk बेहतर है? – john2x

+0

यदि 'os.listdir' आपको जो चाहिए वह करता है, तो यह ठीक है। मुख्य अंतर यह है कि 'os.walk' उपनिर्देशिका में पुन: कार्य करेगा। – gavinb

5

एक सामान्य तरीका PIL, अजगर इमेजिंग पुस्तकालय का उपयोग करने के आयाम प्राप्त करने के लिए है उन फाइलें जो मेल नहीं खाती हैं।

14

आप जनहित याचिका के बाकी की जरूरत है नहीं और सिर्फ 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 
+0

यह मेरे लिए एक आकर्षण की तरह काम करता है, +1 बिना तृतीय पक्ष पुस्तकालयों के समाधान के लिए। – Mercury

2

यहां एक स्क्रिप्ट है जो आपको चाहिए:

#!/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='.') 
0

मैं ऊपर दिए गए उत्तरों से काफी संतुष्ट हूं क्योंकि इससे मुझे इसके लिए एक और सरल उत्तर लिखने में मदद मिली सवाल।

जैसा कि उपर्युक्त उत्तर में केवल स्क्रिप्ट हैं इसलिए पाठकों को यह जांचने के लिए चलाने की आवश्यकता है कि वे ठीक काम करते हैं या नहीं। तो मैंने एक इंटरैक्टिव मोड प्रोग्रामिंग (पायथन शेल से) का उपयोग कर समस्या को हल करने का फैसला किया।

मुझे लगता है कि यह आपको स्पष्ट होगा। मैं पायथन 2.7.12 का उपयोग कर रहा हूं और मैंने छवियों तक पहुंचने के लिए पीआईएल का उपयोग करने के लिए तकिया लाइब्रेरी स्थापित की है। मेरे पास मेरी वर्तमान निर्देशिका में बहुत सारे jpg mages और 1 png छवि है।

अब चलिए पाइथन खोल पर चले जाते हैं।

>>> #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 


>>> 
-1
 
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} } 
+0

जबकि आपके कोड के पीछे विचार अच्छा है, इसमें स्पष्टीकरण की कमी है। मैं यह भी बताऊंगा कि सभी कैप्स में वेरिएबल्स आमतौर पर स्थिरांक के लिए उपयोग किए जाते हैं, इसलिए इसे 'SIZE_IMAGES' के साथ किए गए एक निर्देश के लिए उपयोग करना ऐसा कुछ नहीं है जिसे मैं अनुशंसा करता हूं। – PLPeeters

+0

कृपया, मैं अपने उत्तर का फिर से मूल्यांकन कर सकता हूं। –

संबंधित मुद्दे