blob: 981340fff075f80f847934d4542772b1f3efb723 [file] [log] [blame]
Guido van Rossum1c34fc71992-05-27 14:06:59 +00001# Recognizing image files based on their first few bytes.
2
3
4#-------------------------#
5# Recognize sound headers #
6#-------------------------#
7
8def what(filename):
9 f = open(filename, 'r')
10 h = f.read(32)
11 for tf in tests:
12 res = tf(h, f)
13 if res:
14 return res
15 return None
16
17
18#---------------------------------#
19# Subroutines per image file type #
20#---------------------------------#
21
22tests = []
23
24def test_rgb(h, f):
25 # SGI image library
26 if h[:2] == '\001\332':
27 return 'rgb'
28
29tests.append(test_rgb)
30
31def test_gif(h, f):
32 # GIF ('87 and '89 variants)
33 if h[:6] in ('GIF87a', 'GIF89a'):
34 return 'gif'
35
36tests.append(test_gif)
37
38def test_pnm(h, f):
39 # PBM, PGM, PPM (portable {bit,gray,pix}map; together portable anymap)
Guido van Rossum05b55e71992-06-03 16:48:44 +000040 if len(h) >= 3 and \
41 h[0] == 'P' and h[1] in '123456' and h[2] in ' \t\n\r':
Guido van Rossum1c34fc71992-05-27 14:06:59 +000042 return 'pnm'
43
44tests.append(test_pnm)
45
46def test_tiff(h, f):
47 # TIFF (can be in Motorola or Intel byte order)
48 if h[:2] in ('MM', 'II'):
49 return 'tiff'
50
51tests.append(test_tiff)
52
53def test_rast(h, f):
54 # Sun raster file
55 if h[:4] == '\x59\xA6\x6A\x95':
56 return 'rast'
57
58tests.append(test_rast)
59
Guido van Rossum05b55e71992-06-03 16:48:44 +000060def test_xbm(h, f):
61 # X bitmap (X10 or X11)
62 s = '#define '
63 if h[:len(s)] == s:
64 return 'xbm'
65
66tests.append(test_xbm)
67
Guido van Rossum1c34fc71992-05-27 14:06:59 +000068
69#--------------------#
70# Small test program #
71#--------------------#
72
73def test():
74 import sys
75 recursive = 0
76 if sys.argv[1:] and sys.argv[1] == '-r':
77 del sys.argv[1:2]
78 recursive = 1
79 try:
80 if sys.argv[1:]:
81 testall(sys.argv[1:], recursive, 1)
82 else:
83 testall(['.'], recursive, 1)
84 except KeyboardInterrupt:
85 sys.stderr.write('\n[Interrupted]\n')
86 sys.exit(1)
87
88def testall(list, recursive, toplevel):
89 import sys
90 import os
91 for filename in list:
92 if os.path.isdir(filename):
93 print filename + '/:',
94 if recursive or toplevel:
95 print 'recursing down:'
96 import glob
97 names = glob.glob(os.path.join(filename, '*'))
98 testall(names, recursive, 0)
99 else:
100 print '*** directory (use -r) ***'
101 else:
102 print filename + ':',
103 sys.stdout.flush()
104 try:
105 print what(filename)
106 except IOError:
107 print '*** not found ***'