Package fabio :: Module pnmimage
[hide private]
[frames] | no frames]

Source Code for Module fabio.pnmimage

  1  ## Automatically adapted for numpy.oldnumeric Oct 05, 2007 by alter_code1.py 
  2   
  3  #!/usr/bin/env python 
  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   
24 -class pnmimage(fabioimage):
25 - def __init__(self):
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
35 - def _readheader(self, f):
36 #pnm images have a 3-line header but ignore lines starting with '#' 37 #1st line contains the pnm image sub format 38 #2nd line contains the image pixel dimension 39 #3rd line contains the maximum pixel value (at least for grayscale - check this) 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 #this one has a special header 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 #set the dimensions 66 dims = (self.header['DIMENSIONS'].split()) 67 self.dim1, self.dim2 = int(dims[0]), int(dims[1]) 68 #figure out how many bytes are used to store the data 69 #case construct here! 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 #read the image data 88 try: 89 #let the Subformat header field pick the right decoder 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):
128 #decode (plain-ppm) rgb image 129 pass
130
131 - def P6dec(self, buf, bytecode):
132 #decode (ppm) rgb image 133 pass
134
135 - def P7dec(self, buf, bytecode):
136 #decode pam images, i.e. call one of the other decoders 137 pass
138
139 - def write(filename):
140 warn('write pnm images is not implemented yet.')
141