1 /************************************************************************/
2 /* */
3 /* Copyright 2010 by Joachim Schleicher and Ullrich Koethe */
4 /* */
5 /* This file is part of the VIGRA computer vision library. */
6 /* The VIGRA Website is */
7 /* http://hci.iwr.uni-heidelberg.de/vigra/ */
8 /* Please direct questions, bug reports, and contributions to */
9 /* ullrich.koethe@iwr.uni-heidelberg.de or */
10 /* vigra@informatik.uni-hamburg.de */
11 /* */
12 /* Permission is hereby granted, free of charge, to any person */
13 /* obtaining a copy of this software and associated documentation */
14 /* files (the "Software"), to deal in the Software without */
15 /* restriction, including without limitation the rights to use, */
16 /* copy, modify, merge, publish, distribute, sublicense, and/or */
17 /* sell copies of the Software, and to permit persons to whom the */
18 /* Software is furnished to do so, subject to the following */
19 /* conditions: */
20 /* */
21 /* The above copyright notice and this permission notice shall be */
22 /* included in all copies or substantial portions of the */
23 /* Software. */
24 /* */
25 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */
26 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */
27 /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */
28 /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */
29 /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */
30 /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */
31 /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */
32 /* OTHER DEALINGS IN THE SOFTWARE. */
33 /* */
34 /************************************************************************/
35
36
37 /*
38 * Opens an Andor .sif file as MultiImageView.
39 * The width, height and number of images are extracted
40 * from the ASCII encoded variable length header.
41 *
42 * Based on the Java-Code from
43 * http://rsb.info.nih.gov/ij/plugins/open-sif.html
44 * written by
45 * L. Stirling Churchman (stirling at stanford.edu)
46 * Philippe Carl (pcarl at uni-muenster.de)
47 * Yoshiyuki Arai (arai at phys1.med.osaka-u.ac.jp)
48 *
49 * Currently tested SIF versions: 4.16.12005.0
50 * 4.16.30001.0
51 * 4. 6. 3.0
52 */
53
54 #ifndef VIGRA_SIFIMPORT_HXX
55 #define VIGRA_SIFIMPORT_HXX
56
57 #include <fstream>
58 #include <cstring>
59 #include <cstddef>
60 #include <vector>
61 #include "multi_array.hxx"
62 #include "array_vector.hxx"
63
64 namespace vigra {
65
66
67 /** \addtogroup VigraSIFImport Import of Images from Andor Cameras
68
69 Read an Andor SIF file into a MultiArrayView.
70 */
71 //@{
72
73 /********************************************************/
74 /* */
75 /* SIFImportInfo */
76 /* */
77 /********************************************************/
78 /** \brief Extracts image properties from an Andor SIF file header.
79
80 See \ref readSIF() for a usage example. This object must be
81 used to read the image header of an Andor SIF file
82 and enquire its properties.
83
84 <b>\#include</b> \<vigra/sifImport.hxx\><br>
85 Namespace: vigra
86 */
87 class SIFImportInfo
88 {
89 public:
90 /** Construct SIFImportInfo object.
91
92 The header of the Andor SIF file \a filename is accessed to
93 read the image properties.
94
95 \code
96 SIFImportInfo info(filename);
97 \endcode
98 */
99 VIGRA_EXPORT SIFImportInfo(const char* filename);
100
101 /** Get the width in pixels.
102 */
103 VIGRA_EXPORT int width() const;
104
105 /** Get the height in pixels.
106 */
107 VIGRA_EXPORT int height() const;
108
109 /** Get the stacksize, that is the number of
110 images contained in the dataset.
111 */
112 VIGRA_EXPORT int stacksize() const;
113
114 /** Get the number of dimensions of the dataset represented by this info object.
115 */
116 VIGRA_EXPORT MultiArrayIndex numDimensions() const;
117
118 /** Get the shape of the dataset represented by this info object.
119 */
120 VIGRA_EXPORT ArrayVector<size_t> const & shape() const;
121
122 /** Get the shape (length) of the dataset along dimension \a dim.
123 */
124 VIGRA_EXPORT MultiArrayIndex shapeOfDimension(const int dim) const;
125
126 /** Get the offset to the beginning of the actual data.
127 Everything before this point belongs to the
128 variable length header.
129 */
130 VIGRA_EXPORT std::ptrdiff_t getOffset() const;
131
132 /** Get the filename of this SIF object.
133 */
134 VIGRA_EXPORT const char * getFileName() const;
135
136 /** Output all information such as shutter, Temperature etc.
137 as human readable output.
138
139 <b> Usage:</b>
140
141 <b>\#include</b> \<vigra/sifImport.hxx\><br>
142 Namespace: vigra
143
144 \code
145 SIFImportInfo info(filename);
146 std::cout << info << std::endl; // print infos to the console
147
148 \endcode
149 */
150 VIGRA_EXPORT friend std::ostream& operator<<(std::ostream& os, const SIFImportInfo& info);
151
152 private:
153 const char* m_filename;
154 ArrayVector<size_t> m_dims;
155 std::ptrdiff_t m_offset;
156 int mod;
157 int left, right, bottom, top;
158 int xbin, ybin, xres, yres;
159 int headerlen;
160 double readout;
161 double temperature1, temperature2;
162 long long d;
163 std::string cycleTime, temperature, exposureTime, EMGain,
164 verticalShiftSpeed, version, model, originalFilename, preAmpGain;
165 size_t filesize;
166
167 };
168
169
170
171
172 /** \brief Read the image data specified by the given \ref vigra::SIFImportInfo object
173 and write them into the given 'array'.
174
175 The array must have the correct number of dimensions and shape for the dataset
176 represented by 'info'.
177
178 <b> Declaration:</b>
179
180 \code
181 namespace vigra {
182 void
183 readSIF(const SIFImportInfo &info, MultiArrayView<3, float> array);
184 }
185 \endcode
186
187 <b> Usage:</b>
188
189 <b>\#include</b> \<vigra/sifImport.hxx\><br>
190 Namespace: vigra
191
192 \code
193 SIFImportInfo info(filename);
194
195 // create a 3D array of appropriate size
196 typedef MultiArray<3, float>::difference_type Shape;
197 MultiArray<3, float> in(Shape(info.width(), info.height(), info.stacksize()));
198
199 readSIF(info, in);
200 \endcode
201 */
202 VIGRA_EXPORT void readSIF(const SIFImportInfo &info, MultiArrayView<3, float> array);
203
204 template <unsigned int N, class T, class S>
readSIF(const SIFImportInfo &,MultiArrayView<N,T,S>)205 void readSIF(const SIFImportInfo &, MultiArrayView<N, T, S>)
206 {
207 vigra_precondition(false, "readSIF(): Destination array must be MultiArrayView<3, float>.");
208 }
209
readSIF(const SIFImportInfo & info,MultiArrayView<3,float,UnstridedArrayTag> array)210 inline void readSIF(const SIFImportInfo &info, MultiArrayView<3, float, UnstridedArrayTag> array)
211 {
212 readSIF(info, MultiArrayView<3, float>(array));
213 }
214
215 /**
216 \brief Read parts of the image data from an Andor SIF file specified with an SIFImportInfo object
217 and write them into the MultiArray array.
218
219 \code
220 SIFImportInfo info(filename);
221
222 // create a 3D array of appropriate size
223 MultiArray<3, float> in(Shape3(info.width(), info.height(), 1));
224
225 readBlock(info, Shape3(0,0,0), Shape3(w,h,1), im); // read the first frame only
226
227 \endcode
228 */
229 VIGRA_EXPORT void readSIFBlock(const SIFImportInfo &info, Shape3 offset, Shape3 shape, MultiArrayView<3, float> array);
230
231 template <unsigned int N, class T, class S>
readSIFBlock(const SIFImportInfo &,Shape3,Shape3,MultiArrayView<N,T,S>)232 void readSIFBlock(const SIFImportInfo &, Shape3, Shape3, MultiArrayView<N, T, S>)
233 {
234 vigra_precondition(false, "readSIFBlock(): Destination array must be MultiArrayView<3, float>.");
235 }
236
readSIFBlock(const SIFImportInfo & info,Shape3 offset,Shape3 shape,MultiArrayView<3,float,UnstridedArrayTag> array)237 inline void readSIFBlock(const SIFImportInfo &info, Shape3 offset, Shape3 shape, MultiArrayView<3, float, UnstridedArrayTag> array)
238 {
239 readSIFBlock(info, offset, shape, MultiArrayView<3, float>(array));
240 }
241
242 VIGRA_EXPORT std::ostream& operator<<(std::ostream& os, const SIFImportInfo& info);
243
244 //@}
245
246 } // namespace vigra
247
248 #endif // VIGRA_SIFIMPORT_HXX
249