blob: c320594e97624123af19bdcb1741225938824716 [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
Guido van Rossum81749b01996-07-30 16:26:42 +00008def what(filename, h=None):
Guido van Rossumf813f561996-08-22 21:20:46 +00009 if h is None:
Guido van Rossum81749b01996-07-30 16:26:42 +000010 f = open(filename, 'r')
11 h = f.read(32)
12 else:
13 f = None
14 try:
15 for tf in tests:
16 res = tf(h, f)
17 if res:
18 return res
19 finally:
20 if f: f.close()
Guido van Rossum1c34fc71992-05-27 14:06:59 +000021 return None
22
23
24#---------------------------------#
25# Subroutines per image file type #
26#---------------------------------#
27
28tests = []
29
30def test_rgb(h, f):
31 # SGI image library
32 if h[:2] == '\001\332':
33 return 'rgb'
34
35tests.append(test_rgb)
36
37def test_gif(h, f):
38 # GIF ('87 and '89 variants)
39 if h[:6] in ('GIF87a', 'GIF89a'):
40 return 'gif'
41
42tests.append(test_gif)
43
Guido van Rossum2db91351992-10-18 17:09:59 +000044def test_pbm(h, f):
45 # PBM (portable bitmap)
Guido van Rossum05b55e71992-06-03 16:48:44 +000046 if len(h) >= 3 and \
Guido van Rossum2db91351992-10-18 17:09:59 +000047 h[0] == 'P' and h[1] in '14' and h[2] in ' \t\n\r':
48 return 'pbm'
Guido van Rossum1c34fc71992-05-27 14:06:59 +000049
Guido van Rossum2db91351992-10-18 17:09:59 +000050tests.append(test_pbm)
51
52def test_pgm(h, f):
53 # PGM (portable graymap)
54 if len(h) >= 3 and \
55 h[0] == 'P' and h[1] in '25' and h[2] in ' \t\n\r':
56 return 'pgm'
57
58tests.append(test_pgm)
59
60def test_ppm(h, f):
61 # PPM (portable pixmap)
62 if len(h) >= 3 and \
63 h[0] == 'P' and h[1] in '36' and h[2] in ' \t\n\r':
64 return 'ppm'
65
66tests.append(test_ppm)
Guido van Rossum1c34fc71992-05-27 14:06:59 +000067
68def test_tiff(h, f):
69 # TIFF (can be in Motorola or Intel byte order)
70 if h[:2] in ('MM', 'II'):
71 return 'tiff'
72
73tests.append(test_tiff)
74
75def test_rast(h, f):
76 # Sun raster file
77 if h[:4] == '\x59\xA6\x6A\x95':
78 return 'rast'
79
80tests.append(test_rast)
81
Guido van Rossum05b55e71992-06-03 16:48:44 +000082def test_xbm(h, f):
83 # X bitmap (X10 or X11)
84 s = '#define '
85 if h[:len(s)] == s:
86 return 'xbm'
87
88tests.append(test_xbm)
89
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000090def test_jpeg(h, f):
91 # JPEG data in JFIF format
92 if h[6:10] == 'JFIF':
93 return 'jpeg'
94
95tests.append(test_jpeg)
Guido van Rossum1c34fc71992-05-27 14:06:59 +000096
Guido van Rossum9e330741997-04-11 18:59:38 +000097def test_bmp(h, f):
98 if h[:2] == 'BM':
99 return 'bmp'
100
101tests.append(test_bmp)
102
103def test_png(h, f):
104 if h[:8] == "\211PNG\r\n\032\n":
105 return 'png'
106
107tests.append(test_png)
108
Guido van Rossum1c34fc71992-05-27 14:06:59 +0000109#--------------------#
110# Small test program #
111#--------------------#
112
113def test():
114 import sys
115 recursive = 0
116 if sys.argv[1:] and sys.argv[1] == '-r':
117 del sys.argv[1:2]
118 recursive = 1
119 try:
120 if sys.argv[1:]:
121 testall(sys.argv[1:], recursive, 1)
122 else:
123 testall(['.'], recursive, 1)
124 except KeyboardInterrupt:
125 sys.stderr.write('\n[Interrupted]\n')
126 sys.exit(1)
127
128def testall(list, recursive, toplevel):
129 import sys
130 import os
131 for filename in list:
132 if os.path.isdir(filename):
133 print filename + '/:',
134 if recursive or toplevel:
135 print 'recursing down:'
136 import glob
137 names = glob.glob(os.path.join(filename, '*'))
138 testall(names, recursive, 0)
139 else:
140 print '*** directory (use -r) ***'
141 else:
142 print filename + ':',
143 sys.stdout.flush()
144 try:
145 print what(filename)
146 except IOError:
147 print '*** not found ***'