1
2
3 from __future__ import with_statement
4 __doc__ = """
5 Authors: Gael Goret, Jerome Kieffer, ESRF, France
6 Emails: gael.goret@esrf.fr, jerome.kieffer@esrf.fr
7
8 Binary files images are simple none-compressed 2D images only defined by their :
9 data-type, dimensions, byte order and offset
10
11 This simple library has been made for manipulating exotic/unknown files format.
12 """
13
14 __authors__ = ["Gaël Goret", "Jérôme Kieffer"]
15 __contact__ = "gael.goret@esrf.fr"
16 __license__ = "GPLv3+"
17 __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
18 __version__ = "17 Apr 2012"
19
20 from fabioimage import fabioimage
21 import numpy, logging
22 logger = logging.getLogger("binaryimage")
25 """
26 This simple library has been made for manipulating exotic/unknown files format.
27
28 Binary files images are simple none-compressed 2D images only defined by their :
29 data-type, dimensions, byte order and offset
30 """
31
34
35 @staticmethod
37 """
38 Decide if we need to byteswap
39 """
40 if (endian == '<' and numpy.little_endian) or (endian == '>' and not numpy.little_endian):
41 return False
42 if (endian == '>' and numpy.little_endian) or (endian == '<' and not numpy.little_endian):
43 return True
44
45 - def read(self, fname, dim1, dim2, offset=0, bytecode="int32", endian="<"):
46 """
47 Read a binary image
48 Parameters : fname, dim1, dim2, offset, bytecode, endian
49 fname : file name : str
50 dim1,dim2 : image dimensions : int
51 offset : size of the : int
52 bytecode among : "int8","int16","int32","int64","uint8","uint16","uint32","uint64","float32","float64",...
53 endian among short or long endian ("<" or ">")
54 """
55 self.filename = fname
56 self.dim1 = dim1
57 self.dim2 = dim2
58 self.bytecode = bytecode
59 f = open(self.filename, "rb")
60 dims = [dim2, dim1]
61 bpp = len(numpy.array(0, bytecode).tostring())
62 size = dims[0] * dims[1] * bpp
63
64 f.seek(offset)
65 rawData = f.read(size)
66 if self.swap_needed(endian):
67 data = numpy.fromstring(rawData, bytecode).byteswap().reshape(tuple(dims))
68 else:
69 data = numpy.fromstring(rawData, bytecode).reshape(tuple(dims))
70 self.data = data
71 return self
72
74 "Estimates the size of a file"
75 with open(fname, "rb") as f:
76 bpp = len(numpy.array(0, bytecode).tostring())
77 size = dim1 * dim2 * bpp
78 totsize = len(f.read())
79 logger.info('total size (bytes): %s', totsize)
80 logger.info('expected data size given parameters (bytes): %s', size)
81 logger.info('estimation of the offset value (bytes): %s', totsize - size)
82
86