/usr/share/pyshared/fabio/HiPiCimage.py is in python-fabio 0.1.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #!/usr/bin/env python
"""
Authors: Henning O. Sorensen & Erik Knudsen
Center for Fundamental Research: Metal Structures in Four Dimensions
Risoe National Laboratory
Frederiksborgvej 399
DK-4000 Roskilde
email:erik.knudsen@risoe.dk
+ Jon Wright, ESRF
Information about the file format from Masakatzu Kobayashi is highly appreciated
"""
# Get ready for python3:
from __future__ import with_statement, print_function
import numpy, logging
logger = logging.getLogger("HiPiCimage")
from .fabioimage import fabioimage
class HiPiCimage(fabioimage):
""" Read HiPic images e.g. collected with a Hamamatsu CCD camera"""
def _readheader(self, infile):
"""
Read in a header from an already open file
"""
Image_tag = infile.read(2)
Comment_len = numpy.fromstring(infile.read(2), numpy.uint16)
Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0]
Dump = infile.read(50)
Comment = infile.read(Comment_len)
self.header['Image_tag'] = Image_tag
self.header['Dim_1'] = Dim_1
self.header['Dim_2'] = Dim_2
self.header['Dim_1_offset'] = Dim_1_offset
self.header['Dim_2_offset'] = Dim_2_offset
#self.header['Comment'] = Comment
if Image_tag != 'IM' :
# This does not look like an HiPic file
logging.warning("no opening. Corrupt header of HiPic file " + \
str(infile.name))
Comment_split = Comment[:Comment.find('\x00')].split('\r\n')
for topcomment in Comment_split:
topsplit = topcomment.split(',')
for line in topsplit:
if '=' in line:
key, val = line.split('=' , 1)
# Users cannot type in significant whitespace
key = key.rstrip().lstrip()
self.header_keys.append(key)
self.header[key] = val.lstrip().rstrip()
self.header[key] = val.lstrip('"').rstrip('"')
def read(self, fname, frame=None):
"""
Read in header into self.header and
the data into self.data
"""
self.header = {}
self.resetvals()
infile = self._open(fname, "rb")
self._readheader(infile)
# Compute image size
try:
self.dim1 = int(self.header['Dim_1'])
self.dim2 = int(self.header['Dim_2'])
except:
raise Exception("HiPic file", str(fname) + \
"is corrupt, cannot read it")
bytecode = numpy.uint16
self.bpp = len(numpy.array(0, bytecode).tostring())
# Read image data
block = infile.read(self.dim1 * self.dim2 * self.bpp)
infile.close()
#now read the data into the array
try:
self.data = numpy.reshape(
numpy.fromstring(block, bytecode),
[self.dim2, self.dim1])
except:
print(len(block), bytecode, self.bpp, self.dim2, self.dim1)
raise IOError(
'Size spec in HiPic-header does not match size of image data field')
self.bytecode = self.data.dtype.type
# Sometimes these files are not saved as 12 bit,
# But as 16 bit after bg subtraction - which results
# negative values saved as 16bit. Therefore values higher
# 4095 is really negative values
if self.data.max() > 4095:
gt12bit = self.data > 4095
self.data = self.data - gt12bit * (2 ** 16 - 1)
# ensure the PIL image is reset
self.pilimage = None
return self
|