我需要检查目录中图像的尺寸。目前它有约700张图片。 我只需要检查尺寸,如果尺寸与给定的尺寸不匹配,它将被移动到不同的文件夹。我如何开始?如何使用python检查目录中所有图像的尺寸?
回答
您可以使用Python Imaging Library(又名PIL)读取图像标题并查询尺寸。
接近它的一种方法是编写一个函数,它接受一个文件名并返回维度(使用PIL)。然后使用os.path.walk
函数遍历目录中的所有文件,并使用此函数。收集结果后,您可以创建一个映射字典filename -> dimensions
,然后使用列表理解(请参阅itertools
)过滤掉那些不符合所需大小的字典。
一种常见的方法是使用PIL,Python图像库,以获得尺寸:
from PIL import Image
import os.path
filename = os.path.join('path', 'to', 'image', 'file')
img = Image.open(filename)
print img.size
然后,你需要遍历目录中的文件,检查尺寸对你的要求的尺寸,并移动那些不匹配的文件。
如果您不需要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
这对我来说就像一个魅力,+1给予没有第三方库的解决方案。 – Mercury 2016-11-02 10:34:32
这是一个脚本,它可以满足你的需求:
#!/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='.')
我对上面提供的答案非常满意,因为那些帮助我为此编写了另一个简单的答案题。
由于上述答案只有脚本,因此读者需要运行以检查它们是否正常工作。所以我决定使用交互模式编程(从Python shell)解决问题。
我认为这一点很清楚。我正在使用Python 2.7.12和我已经安装枕头图书馆使用PIL访问images.I在我目前的目录中有很多jpg mages和1 png图像。
现在让我们继续讨论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)
在folder_images
您箭头目录,它是imagens。 size_images
是一个具有图像大小的变量,采用这种格式。
Example {'image_name.jpg' : {'width': 100, 'heigth': 100} }
尽管代码背后的想法很好,但它没有解释。我还会指出,所有大写字母的变量通常用于常量,所以将它用于像“SIZE_IMAGES”一样的字典不是我会推荐的。 – PLPeeters 2017-03-03 13:48:39
请,我可以重新评估我的答案。 – 2017-03-03 14:03:27
- 1. 内存问题检查图像尺寸
- 2. 上传前检查图像尺寸
- 3. 检查图像尺寸客户端
- 4. 显示的图像尺寸与所采用的尺寸相同?
- 5. 如何设置相同尺寸的所有图像
- 6. 图像尺寸,
- 7. 如何上传前检查图像尺寸laravel 4
- 8. 尺寸图像的尺寸1600 * 1200
- 9. html使图像按钮尺寸等于图像尺寸
- 10. Jcrop有大尺寸图像
- 11. 如何获取所有纸张尺寸名称和相应的像素尺寸?
- 12. 如何减少内存使用量,而在PHP检查图像尺寸
- 13. 使用PHP上传图像前检查图像尺寸(高度和宽度)
- 14. 如何根据屏幕尺寸使用不同尺寸的图像集?
- 15. 检查相机或图像的像素尺寸
- 16. 使mat-card-image中的所有图像具有相同的尺寸,但尺寸正确
- 17. 尺寸图像以适合WebView尺寸
- 18. 如何增加商品目录页中的产品图像尺寸Woo Commerce
- 19. 如何为所有屏幕尺寸创建图像作为背景图像
- 20. PHP图像尺寸
- 21. Carrierwave图像尺寸
- 22. ImageView图像尺寸
- 23. UIViewcontroller图像尺寸
- 24. 如何使Flexbox项目适合其图像尺寸?
- 25. 检查所有图像使用jquery
- 26. Android上的图像所需的所有图像尺寸是什么?
- 27. 如何显示图像的全尺寸
- 28. 如何设置UINavigation尺寸以适合背景图像尺寸?
- 29. 检查表的尺寸
- 30. Python:从URL获取图像尺寸
我做到了这一点,但与os.listdir相反..与700图像工作得很好。 os.path.walk更好吗? – john2x 2009-10-03 16:07:59
如果'os.listdir'完成你所需要的,那很好。主要的区别是'os.walk'会递归到子目录中。 – gavinb 2009-10-04 01:38:25