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 fabio 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.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