1
2
3
4 """
5
6 Authors: Henning O. Sorensen & Erik Knudsen
7 Center for Fundamental Research: Metal Structures in Four Dimensions
8 Risoe National Laboratory
9 Frederiksborgvej 399
10 DK-4000 Roskilde
11 email:henning.sorensen@risoe.dk
12
13 """
14
15 import Image
16 import numpy as N
17 from fabioimage import fabioimage
18
19 SUBFORMATS = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7']
20
21 HEADERITEMS = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL']
22 P7HEADERITEMS = ['WIDTH', 'HEIGHT', 'DEPTH', 'MAXVAL', 'TUPLTYPE', 'ENDHDR']
23
26 fun = getattr(fabioimage, '__init__', lambda x: None)
27 fun(self)
28 self.data = None
29 self.header = {'Subformat':'P5'}
30 self.dim1 = self.dim2 = 0
31 self.m = self.maxval = self.stddev = self.minval = None
32 self.header_keys = self.header.keys()
33 self.bytecode = None
34
36
37
38
39
40 self.header_keys = ['SUBFORMAT', 'DIMENSIONS', 'MAXVAL']
41
42 l = f.readline().strip()
43 if l not in SUBFORMATS:
44 raise IOError, ('unknown subformat of pnm: %s' % l)
45 else:
46 self.header['SUBFORMAT'] = l
47
48 if self.header['SUBFORMAT'] == 'P7':
49 self.header_keys = P7HEADERITEMS
50
51 while 'ENDHDR' not in l:
52 l = f.readline()
53 while(l[0] == '#'): l = f.readline()
54 s = l.lsplit(' ', 1)
55 if s[0] not in P7HEADERITEMS:
56 raise IOError, ('Illegal pam (netpnm p7) headeritem %s' % s[0])
57 self.self.header[s[0]] = s[1]
58 else:
59 self.header_keys = HEADERITEMS
60 for k in self.header_keys[1:]:
61 l = f.readline()
62 while(l[0] == '#'): l = f.readline()
63 self.header[k] = l.strip()
64
65
66 dims = (self.header['DIMENSIONS'].split())
67 self.dim1, self.dim2 = int(dims[0]), int(dims[1])
68
69
70 m = int(self.header['MAXVAL'])
71 if m < 256:
72 self.bytecode = N.uint8
73 elif m < 65536:
74 self.bytecode = N.uint16
75 elif m < 2147483648L:
76 self.bytecode = N.uint32
77 warn('32-bit pixels are not really supported by the netpgm standard')
78 else:
79 raise IOError, 'could not figure out what kind of pixels you have'
80
81 - def read(self, fname, verbose=0):
82 self.header = {}
83 self.resetvals()
84 infile = self._open(fname)
85 self._readheader(infile)
86
87
88 try:
89
90 self.data = eval('self.' + self.header['SUBFORMAT'] + 'dec(infile,self.bytecode)')
91 except ValueError:
92 raise IOError
93 self.resetvals()
94 return self
95
96 - def P1dec(self, buf, bytecode):
97 data = N.zeros((self.dim2, self.dim1))
98 i = 0
99 for l in buf.readlines():
100 try:
101 data[i, :] = N.array(l.split()).astype(bytecode)
102 except ValueError:
103 raise IOError, 'Size spec in pnm-header does not match size of image data field'
104 return data
105
106 - def P4dec(self, buf, bytecode):
107 warn('single bit (pbm) images are not supported - yet')
108
109 - def P2dec(self, buf, bytecode):
110 data = N.zeros((self.dim2, self.dim1))
111 i = 0
112 for l in buf.readlines():
113 try:
114 data[i, :] = N.array(l.split()).astype(bytecode)
115 except ValueError:
116 raise IOError, 'Size spec in pnm-header does not match size of image data field'
117 return data
118
119 - def P5dec(self, buf, bytecode):
120 l = buf.read()
121 try:
122 data = N.reshape(N.fromstring(l, bytecode), [self.dim2, self.dim1]).byteswap()
123 except ValueError:
124 raise IOError, 'Size spec in pnm-header does not match size of image data field'
125 return data
126
127 - def P3dec(self, buf, bytecode):
130
131 - def P6dec(self, buf, bytecode):
134
135 - def P7dec(self, buf, bytecode):
138
140 warn('write pnm images is not implemented yet.')
141