source: Sophya/trunk/SophyaLib/NTools/cimage.cc@ 3389

Last change on this file since 3389 was 3220, checked in by ansari, 18 years ago

Ajout instanciation int_2 et complex<r_4,r_8> pour la classe Image<T> , Reza 12/04/2007

File size: 5.3 KB
Line 
1// Classes image heritant de TMatrix<T>
2// R.Ansari, C.Magneville 07/2000
3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
5#include "sopnamsp.h"
6#include "machdefs.h"
7#include <stdio.h>
8#include <stdlib.h>
9#include "pexceptions.h"
10#include "cimage.h"
11#include "datatype.h"
12#include <typeinfo>
13
14/*!
15 \class SOPHYA::Image
16 \ingroup NTools
17 This class specializes the Matrix class, for representing intensity
18 (or grey-level) images. It adds the possibility of defining pixel
19 size and offset. The convention for the acces operator is also
20 changed, compared to the matrix class.
21*/
22
23//! Default constructor - Pixel array not allocated
24template <class T>
25Image<T>::Image()
26// Constructeur par defaut.
27 : TMatrix<T>()
28{
29 SetOrg();
30 SetPixelSize();
31}
32
33//! Constructor, with specification of the image size, pixel size and offsets
34template <class T>
35Image<T>::Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy)
36// Constructeur par defaut.
37 : TMatrix<T>(sizy, sizx)
38{
39 SetOrg(orgx, orgy);
40 SetPixelSize(szpx, szpy);
41}
42
43//! Copy constructor
44template <class T>
45Image<T>::Image(const Image<T>& a)
46 : TMatrix<T>(a)
47{
48 SetOrg(a.XOrg(), a.YOrg() );
49 SetPixelSize(a.XPixSize(), a.YPixSize());
50}
51
52
53//! Copy constructor with possibility of duplicating the pixel array
54/*!
55 \param share : if true, the data is shared, duplicated if false.
56*/
57template <class T>
58Image<T>::Image(const Image<T>& a, bool share)
59 : TMatrix<T>(a, share)
60{
61 SetOrg(a.XOrg(), a.YOrg() );
62 SetPixelSize(a.XPixSize(), a.YPixSize());
63}
64
65//! Destructor
66template <class T>
67Image<T>::~Image()
68{
69}
70
71
72// --------------------------------------------------------
73// Les objets delegues pour la gestion de persistance
74// --------------------------------------------------------
75/*!
76 \class SOPHYA::FIO_Image
77 \ingroup Image
78 Class for persistent management of Image
79
80 */
81///////////////////////////////////////////////////////////
82
83//! Default constructor
84template <class T>
85FIO_Image<T>::FIO_Image()
86 : FIO_TArray<T>()
87{
88}
89
90
91//! Constructor from the file \b filename
92template <class T>
93FIO_Image<T>::FIO_Image(string const & filename)
94 : FIO_TArray<T>(filename)
95{
96}
97
98//! Constructor from the Image \b obj
99template <class T>
100FIO_Image<T>::FIO_Image(const Image<T> & obj)
101 : FIO_TArray<T>()
102{
103 this->dobj = new Image<T>(obj, true);
104 this->ownobj=true;
105}
106
107//! Connect with a Image \b obj
108template <class T>
109FIO_Image<T>::FIO_Image(Image<T> * obj)
110 : FIO_TArray<T>(obj)
111{
112}
113
114
115//! Connect Image \b o
116template <class T>
117void FIO_Image<T>::SetDataObj(AnyDataObj & o)
118{
119 Image<T> * po = dynamic_cast< Image<T> * >(&o);
120 if (po == NULL) {
121 char buff[160];
122 sprintf(buff,"FIO_Image<%s>::SetDataObj(%s) - Object type error ! ",
123 DataTypeInfo<T>::getTypeName().c_str(), typeid(o).name());
124 throw TypeMismatchExc(PExcLongMessage(buff));
125 }
126 if (this->ownobj && this->dobj) delete this->dobj;
127 this->dobj = po; this->ownobj = false;
128}
129
130template <class T>
131void FIO_Image<T>::ReadSelf(PInPersist& is)
132{
133 if (this->dobj == NULL) this->dobj = new Image<T>;
134 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
135// On lit les 3 premiers uint_4
136// 0: Numero de version, 1 : reserve
137 uint_4 itab[3];
138 is.Get(itab,3);
139
140// Image<T> part data
141 r_8 orgx, orgy;
142 is.Get(orgx);
143 is.Get(orgy);
144 img->SetOrg(orgx, orgy);
145 r_8 szx, szy;
146 is.Get(szx);
147 is.Get(szy);
148 img->SetPixelSize(szx, szy);
149
150// Reading the TArray part
151 FIO_TArray<T>::ReadSelf(is);
152}
153
154template <class T>
155void FIO_Image<T>::WriteSelf(POutPersist& os) const
156{
157 if (this->dobj == NULL) return;
158 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
159// On ecrit 3 uint_4 ....
160 uint_4 itab[3];
161 itab[0] = 1; // Numero de version a 1
162 itab[1] = 0;
163 itab[2] = 0;
164 os.Put(itab,3);
165
166// Image<T> part data
167 os.Put(img->XOrg());
168 os.Put(img->XOrg());
169 os.Put(img->XPixSize());
170 os.Put(img->YPixSize());
171
172// Writing the TArray part
173 FIO_TArray<T>::WriteSelf(os);
174}
175
176///////////////////////////////////////////////////////////////
177#ifdef __CXX_PRAGMA_TEMPLATES__
178#pragma define_template Image<uint_2>
179#pragma define_template Image<int_2>
180#pragma define_template Image<int_4>
181#pragma define_template Image<int_8>
182#pragma define_template Image<r_4>
183#pragma define_template Image<r_8>
184#pragma define_template Image< complex<r_4> >
185#pragma define_template Image< complex<r_8> >
186
187#pragma define_template FIO_Image<uint_2>
188#pragma define_template FIO_Image<int_2>
189#pragma define_template FIO_Image<int_4>
190#pragma define_template FIO_Image<int_8>
191#pragma define_template FIO_Image<r_4>
192#pragma define_template FIO_Image<r_8>
193#pragma define_template FIO_Image< complex<r_4> >
194#pragma define_template FIO_Image< complex<r_8> >
195#endif
196
197#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
198namespace SOPHYA {
199template class Image<uint_2>;
200template class Image<int_2>;
201template class Image<int_4>;
202template class Image<int_8>;
203template class Image<r_4>;
204template class Image<r_8>;
205template class Image< complex<r_4> >;
206template class Image< complex<r_8> >;
207
208template class FIO_Image<uint_2>;
209template class FIO_Image<int_2>;
210template class FIO_Image<int_4>;
211template class FIO_Image<int_8>;
212template class FIO_Image<r_4>;
213template class FIO_Image<r_8>;
214template class FIO_Image< complex<r_4> >;
215template class FIO_Image< complex<r_8> >;
216}
217#endif
Note: See TracBrowser for help on using the repository browser.