Source code for fabio.pixiimage

"""
Author: Jon Wright, ESRF.
"""
# Get ready for python3:
from __future__ import with_statement, print_function

__authors__ = ["Jon Wright", "Jérôme Kieffer"]
__contact__ = "wright@esrf.fr"
__license__ = "GPLv3+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
__version__ = "29 Oct 2013"

import numpy
import sys
import os
from .fabioimage import fabioimage

class pixiimage(fabioimage):
    _need_a_seek_to_read = True

[docs] def _readheader(self, infile): infile.seek(0) self.header = {} byt = infile.read(4) framesize = numpy.fromstring(byt, numpy.int32) if framesize == 243722: # life is good width = 476 height = 512 offset = 24 self.header['framesize'] = framesize self.header['width'] = width self.header['height'] = height self.header['offset'] = offset else: print("Pixiimage, bad framesize: %s" % framesize) raise def read(self, fname, frame=None): if frame is None: frame = 0
[docs] self.header = {} self.resetvals() infile = self._open(fname, "rb") self.sequencefilename = fname self._readheader(infile) self.nframes = os.path.getsize(fname) / 487448 self._readframe(infile, frame) infile.close() return self def _makeframename(self): self.filename = "%s$%04d" % (self.sequencefilename, self.currentframe)
def _readframe(self, filepointer, img_num): if (img_num > self.nframes or img_num < 0): raise Exception("Bad image number") imgstart = self.header['offset'] + img_num * (512 * 476 * 2 + 24) filepointer.seek(imgstart, 0) self.data = numpy.fromstring(filepointer.read(512 * 476 * 2), numpy.uint16) self.data.shape = self.header['height'], self.header['width'] self.dim2, self.dim1 = self.data.shape self.currentframe = int(img_num) self._makeframename() def write(self, fname, force_type=numpy.uint16): raise Exception("Write is not implemented")
[docs] def getframe(self, num): """ Returns a frame as a new fabioimage object
[docs] """ if num < 0 or num > self.nframes: raise Exception("Requested frame number is out of range") # Do a deep copy of the header to make a new one newheader = {} for k in self.header.keys(): newheader[k] = self.header[k] frame = pixiimage(header=newheader) frame.nframes = self.nframes frame.sequencefilename = self.sequencefilename infile = frame._open(self.sequencefilename, "rb") frame._readframe(infile, num) infile.close() return frame def next(self): """ Get the next image in a series as a fabio image
[docs] """ if self.currentframe < (self.nframes - 1) and self.nframes > 1: return self.getframe(self.currentframe + 1) else: newobj = pixiimage() newobj.read(next_filename( self.sequencefilename)) return newobj def previous(self): """ Get the previous image in a series as a fabio image
[docs] """ if self.currentframe > 0: return self.getframe(self.currentframe - 1) else: newobj = pixiimage() newobj.read(previous_filename( self.sequencefilename)) return newobj def demo(fname): i = pixiimage() i.read(fname)
[docs] import pylab pylab.imshow(numpy.log(i.data)) print("%s\t%s\t%s\ts" % (i.filename, i.data.max(), i.data.min(), i.data.mean())) pylab.title(i.filename) pylab.show() while 1: i = i.next() pylab.imshow(numpy.log(i.data)) pylab.title(i.filename) pylab.show() raw_input() if __name__ == "__main__": import sys demo(sys.argv[1])