यदि आप छवि सामग्री के बारे में परवाह नहीं करते हैं, तो PIL शायद एक ओवरकिल है।
मैं अजगर जादू मॉड्यूल के उत्पादन को पार्स करने का सुझाव देता हूं:
>>> t = magic.from_file('teste.png')
>>> t
'PNG image data, 782 x 602, 8-bit/color RGBA, non-interlaced'
>>> re.search('(\d+) x (\d+)', t).groups()
('782', '602')
यह एक प्रकार से कामेच्छा के आसपास का आवरण है जो फ़ाइल प्रकार के हस्ताक्षर की पहचान करने के लिए संभव के रूप में कुछ बाइट्स के रूप में पढ़ा जाता है।
स्क्रिप्ट का प्रासंगिक संस्करण:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[अपडेट करें]
हम्म, दुर्भाग्य से, जब jpegs पर लागू होता है, तो उपरोक्त "JPEG छवि डेटा, EXIF मानक 2.21" देता है। कोई छवि आकार नहीं! - एलेक्स फ्लिंट
Jpegs की तरह लगता जादू-प्रतिरोधी हैं। :-)
मैं देख सकता हूं कि क्यों: JPEG फ़ाइलों के लिए छवि आयाम प्राप्त करने के लिए, आपको अधिक बाइट्स पढ़ने पड़ सकते हैं, जैसे कि कामेच्छा पढ़ने के लिए पसंद है।
मेरी आस्तीन ऊपर लुढ़क गई और यह बहुत ही अनछुए स्निपेट के साथ आया (इसे GitHub से प्राप्त करें) जिसके लिए किसी तृतीय-पक्ष मॉड्यूल की आवश्यकता नहीं है।
#-------------------------------------------------------------------------------
# Name: get_image_size
# Purpose: extract image dimensions given a file path using just
# core modules
#
# Author: Paulo Scardine (based on code from Emmanuel VAÏSSE)
#
# Created: 26/09/2013
# Copyright: (c) Paulo Scardine 2013
# Licence: MIT
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import os
import struct
class UnknownImageFormat(Exception):
pass
def get_image_size(file_path):
"""
Return (width, height) for a given img file content - no external
dependencies except the os and struct modules from core
"""
size = os.path.getsize(file_path)
with open(file_path) as input:
height = -1
width = -1
data = input.read(25)
if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'):
# GIFs
w, h = struct.unpack("<HH", data[6:10])
width = int(w)
height = int(h)
elif ((size >= 24) and data.startswith('\211PNG\r\n\032\n')
and (data[12:16] == 'IHDR')):
# PNGs
w, h = struct.unpack(">LL", data[16:24])
width = int(w)
height = int(h)
elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'):
# older PNGs?
w, h = struct.unpack(">LL", data[8:16])
width = int(w)
height = int(h)
elif (size >= 2) and data.startswith('\377\330'):
# JPEG
msg = " raised while trying to decode as JPEG."
input.seek(0)
input.read(2)
b = input.read(1)
try:
while (b and ord(b) != 0xDA):
while (ord(b) != 0xFF): b = input.read(1)
while (ord(b) == 0xFF): b = input.read(1)
if (ord(b) >= 0xC0 and ord(b) <= 0xC3):
input.read(3)
h, w = struct.unpack(">HH", input.read(4))
break
else:
input.read(int(struct.unpack(">H", input.read(2))[0])-2)
b = input.read(1)
width = int(w)
height = int(h)
except struct.error:
raise UnknownImageFormat("StructError" + msg)
except ValueError:
raise UnknownImageFormat("ValueError" + msg)
except Exception as e:
raise UnknownImageFormat(e.__class__.__name__ + msg)
else:
raise UnknownImageFormat(
"Sorry, don't know how to get information from this file."
)
return width, height
[अद्यतन २०१ ९]
एक जंग कार्यान्वयन की जाँच करें: https://github.com/scardine/imsz
.open()
स्मृति में पूरी फ़ाइल पढ़ता है ... (कि क्या.load()
) करता है - ताकि तक मुझे पता है - यह अच्छा के रूप में है के रूप में उपयोग हो जाता हैPIL