আপনি যদি চিত্রের বিষয়বস্তুগুলি সম্পর্কে চিন্তা না করেন তবে পিআইএল সম্ভবত একটি ওভারকিল।
আমি পাইথন ম্যাজিক মডিউলটির আউটপুট পার্স করার পরামর্শ দিচ্ছি:
>>> 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
[হালনাগাদ]
হুম, দুর্ভাগ্যক্রমে, যখন জেপিগগুলিতে প্রয়োগ করা হয়, উপরেরটি "'জেপিইজি চিত্র ডেটা দেয়, এক্সআইএফ স্ট্যান্ডার্ড 2.21'" দেয়। কোন চিত্র আকার! - অ্যালেক্স ফ্লিন্ট
জেপিগের মতো মনে হয় যাদু-প্রতিরোধী। :-)
আমি দেখতে পাচ্ছি কেন: জেপিইজি ফাইলগুলির জন্য চিত্রের মাত্রা পেতে, আপনাকে লিবারমাজিক পড়ার চেয়ে বেশি বাইট পড়তে হতে পারে।
আমার আস্তিনগুলি ঘূর্ণিত করল এবং এটি খুব অনাকাঙ্ক্ষিত স্নিপেট নিয়ে এসেছিল (এটি গিটহাব থেকে পান) যাতে তৃতীয় পক্ষের মডিউলগুলির প্রয়োজন হয় না।
#-------------------------------------------------------------------------------
# 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