Staging
v0.5.1
https://github.com/python/cpython
Revision 5baf4bc97863dc2a5e89ca22ac73bdbf34dff925 authored by Guido van Rossum on 29 December 1997, 20:05:45 UTC, committed by Guido van Rossum on 29 December 1997, 20:05:45 UTC
input.  When an EOF is read, break out of the loop instead of (by
default) writing an empty line (which doesn't do much good).  Don't
close self when falling through the loop.
1 parent 588f38e
Raw File
Tip revision: 5baf4bc97863dc2a5e89ca22ac73bdbf34dff925 authored by Guido van Rossum on 29 December 1997, 20:05:45 UTC
Moved things around a bit in interact(), so outout is processed before
Tip revision: 5baf4bc
imghdr.py
# Recognizing image files based on their first few bytes.


#-------------------------#
# Recognize image headers #
#-------------------------#

def what(file, h=None):
	if h is None:
		if type(file) == type(''):
			f = open(file, 'rb')
			h = f.read(32)
		else:
			location = file.tell()
			h = file.read(32)
			file.seek(location)
			f = None	
	else:
		f = None
	try:
		for tf in tests:
			res = tf(h, f)
			if res:
				return res
	finally:
		if f: f.close()
	return None


#---------------------------------#
# Subroutines per image file type #
#---------------------------------#

tests = []

def test_rgb(h, f):
	# SGI image library
	if h[:2] == '\001\332':
		return 'rgb'

tests.append(test_rgb)

def test_gif(h, f):
	# GIF ('87 and '89 variants)
	if h[:6] in ('GIF87a', 'GIF89a'):
		return 'gif'

tests.append(test_gif)

def test_pbm(h, f):
	# PBM (portable bitmap)
	if len(h) >= 3 and \
		h[0] == 'P' and h[1] in '14' and h[2] in ' \t\n\r':
		return 'pbm'

tests.append(test_pbm)

def test_pgm(h, f):
	# PGM (portable graymap)
	if len(h) >= 3 and \
		h[0] == 'P' and h[1] in '25' and h[2] in ' \t\n\r':
		return 'pgm'

tests.append(test_pgm)

def test_ppm(h, f):
	# PPM (portable pixmap)
	if len(h) >= 3 and \
		h[0] == 'P' and h[1] in '36' and h[2] in ' \t\n\r':
		return 'ppm'

tests.append(test_ppm)

def test_tiff(h, f):
	# TIFF (can be in Motorola or Intel byte order)
	if h[:2] in ('MM', 'II'):
		return 'tiff'

tests.append(test_tiff)

def test_rast(h, f):
	# Sun raster file
	if h[:4] == '\x59\xA6\x6A\x95':
		return 'rast'

tests.append(test_rast)

def test_xbm(h, f):
	# X bitmap (X10 or X11)
	s = '#define '
	if h[:len(s)] == s:
		return 'xbm'

tests.append(test_xbm)

def test_jpeg(h, f):
	# JPEG data in JFIF format
	if h[6:10] == 'JFIF':
		return 'jpeg'

tests.append(test_jpeg)

def test_bmp(h, f):
	if h[:2] == 'BM':
		return 'bmp'
		
tests.append(test_bmp)

def test_png(h, f):
	if h[:8] == "\211PNG\r\n\032\n":
		return 'png'

tests.append(test_png)

#--------------------#
# Small test program #
#--------------------#

def test():
	import sys
	recursive = 0
	if sys.argv[1:] and sys.argv[1] == '-r':
		del sys.argv[1:2]
		recursive = 1
	try:
		if sys.argv[1:]:
			testall(sys.argv[1:], recursive, 1)
		else:
			testall(['.'], recursive, 1)
	except KeyboardInterrupt:
		sys.stderr.write('\n[Interrupted]\n')
		sys.exit(1)

def testall(list, recursive, toplevel):
	import sys
	import os
	for filename in list:
		if os.path.isdir(filename):
			print filename + '/:',
			if recursive or toplevel:
				print 'recursing down:'
				import glob
				names = glob.glob(os.path.join(filename, '*'))
				testall(names, recursive, 0)
			else:
				print '*** directory (use -r) ***'
		else:
			print filename + ':',
			sys.stdout.flush()
			try:
				print what(filename)
			except IOError:
				print '*** not found ***'
back to top