source: Sophya/branches/Reza/AddOn/PIPhoto/imgmag_pi.cc@ 3553

Last change on this file since 3553 was 3553, checked in by ansari, 17 years ago

Creation du module PIPhoto, interface piapp-ImageMagick pour la manipulation des images (jpg, gif...) ds piapp - Reza 14 Dec 2008

File size: 6.7 KB
Line 
1#include "imgmag_pi.h"
2// ------------------------------------------------------------------
3// ------------------ Classe ImgMagObj -----------------------
4
5/* --Methode--*/
6ImgMagObj::ImgMagObj(string filename)
7 : Magick::Image()
8{
9 read(filename.c_str());
10}
11
12/* --Methode--*/
13ImgMagObj::ImgMagObj(const unsigned int width, const unsigned int height)
14 : Magick::Image(Magick::Geometry(width, height), Magick::ColorRGB(0., 0., 0.) )
15{
16}
17
18/* --Methode--*/
19ImgMagObj::ImgMagObj(PIPixRGBArray const & rgba)
20 : Magick::Image(Magick::Geometry(rgba.XSize(), rgba.YSize()), Magick::ColorRGB(0., 0., 0.) )
21{
22 for (unsigned int i=0; i<columns(); i++)
23 for (unsigned int j=0; j<rows(); j++) {
24 PIPixRGB rgb = rgba(i,j);
25 Magick::ColorRGB col((double)rgb.red/255., (double)rgb.green/255.,
26 (double)rgb.blue/255.);
27 pixelColor(i,j,col);
28 }
29}
30
31/* --Methode--*/
32void ImgMagObj::FillPIRGBArray(PIPixRGBArray& rgba)
33{
34 rgba.SetSize(XSize(), YSize());
35 for (unsigned int i=0; i<columns(); i++)
36 for (unsigned int j=0; j<rows(); j++) {
37 Magick::ColorRGB col = pixelColor(i,j);
38 PIPixRGB rgb;
39 rgba(i,j).red = (unsigned char)(col.red()*255.);
40 rgba(i,j).green = (unsigned char)(col.green()*255.);
41 rgba(i,j).blue = (unsigned char)(col.blue()*255.);
42 }
43 return;
44}
45
46// ------------------------------------------------------------------
47// ------------------ Classe ImgMagP2DAdaptRGB -----------------------
48
49/* --Methode--*/
50ImgMagP2DAdaptRGB::ImgMagP2DAdaptRGB(Magick::Image * img, bool ad)
51 : P2DArrayAdapter(img->columns(), img->rows() )
52{
53 aDel = ad; mPix = img;
54}
55
56/* --Methode--*/
57ImgMagP2DAdaptRGB::~ImgMagP2DAdaptRGB()
58{
59 if ( (aDel) && (mPix) ) delete mPix;
60}
61
62/* --Methode--*/
63double ImgMagP2DAdaptRGB::Value(int ix, int jy)
64{
65 if ( (ix < 0) || (jy < 0) || (ix >= sX) || (jy >= sY) ) return(0.);
66 Magick::ColorRGB col = mPix->pixelColor(ix,jy);
67 return ( ((col.blue()*256.+col.green())*256.+col.red())*255. );
68}
69
70/* --Methode--*/
71double ImgMagP2DAdaptRGB::MeanVal(int ix1, int ix2, int jy1, int jy2)
72{
73 int ec;
74 if (ix1>ix2) { ec=ix1; ix1=ix2; ix2=ec; }
75 if (jy1>jy2) { ec=jy1; jy1=jy2; jy2=ec; }
76 unsigned long r = 0.;
77 unsigned long g = 0.;
78 unsigned long b = 0.;
79 Magick::ColorRGB rgb;
80 for(int j=jy1; j<=jy2; j++) {
81 for(int i=ix1; i<=ix2; i++) {
82 rgb = mPix->pixelColor(i, j);
83 r += (unsigned long)(rgb.red()*255.);
84 g += (unsigned long)(rgb.green()*255.);
85 b += (unsigned long)(rgb.blue()*255.);
86 }
87 }
88 unsigned long n = (jy2-jy1+1)*(ix2-ix1+1);
89 r /= n; g /= n; b /= n;
90 return ((double)((b*256+g)*256+r));
91/* La meme chose calculee en double ne marche pas !!!!
92 double r = 0.;
93 double g = 0.;
94 double b = 0.;
95 Magick::ColorRGB rgb;
96 for(int j=jy1; j<=jy2; j++) {
97 for(int i=ix1; i<=ix2; i++) {
98 rgb = mPix->pixelColor(i, j);
99 r += rgb.red(); g += rgb.green(); b += rgb.blue();
100 }
101 }
102 double n = (jy2-jy1+1)*(ix2-ix1+1);
103 r /= n; g /= n; b /= n;
104 return ( ((b*256.+g)*256.+r)*255. );
105*/
106}
107
108
109// ------------------------------------------------------------------
110// ------------------ Classe ImgMagP2DAdaptGS -----------------------
111
112/* --Methode--*/
113ImgMagP2DAdaptGS::ImgMagP2DAdaptGS(Magick::Image * img, bool ad)
114 : P2DArrayAdapter(img->columns(), img->rows() )
115{
116 aDel = ad; mPix = img;
117}
118
119/* --Methode--*/
120ImgMagP2DAdaptGS::~ImgMagP2DAdaptGS()
121{
122 if ( (aDel) && (mPix) ) delete mPix;
123}
124
125/* --Methode--*/
126double ImgMagP2DAdaptGS::Value(int ix, int jy)
127{
128 if ( (ix < 0) || (jy < 0) || (ix >= sX) || (jy >= sY) ) return(0.);
129 Magick::ColorGray grey = mPix->pixelColor(ix,jy);
130 return ( grey.shade() );
131}
132
133/* --Methode--*/
134double ImgMagP2DAdaptGS::MeanVal(int ix1, int ix2, int jy1, int jy2)
135{
136 int ec;
137 if (ix1>ix2) { ec=ix1; ix1=ix2; ix2=ec; }
138 if (jy1>jy2) { ec=jy1; jy1=jy2; jy2=ec; }
139 double gr = 0;
140 for(int j=jy1; j<=jy2; j++)
141 for(int i=ix1; i<=ix2; i++) {
142 Magick::ColorGray grey = mPix->pixelColor(i, j);
143 gr += grey.shade();
144 }
145 double n = (jy2-jy1+1)*(ix2-ix1+1);
146 return ( gr/n );
147}
148
149// ------------------------------------------------------------------
150// Adapteur d'objet ImgMagObj pour gestion par NamedObjMgr de piapp
151
152/* --Methode-- */
153NOMAdapter_ImgMag::NOMAdapter_ImgMag(ImgMagObj* o)
154 : NObjMgrAdapter(o)
155{
156mImg = o;
157}
158
159/* --Methode-- */
160NOMAdapter_ImgMag::~NOMAdapter_ImgMag()
161{
162}
163
164/* --Methode-- */
165NObjMgrAdapter* NOMAdapter_ImgMag::Clone(AnyDataObj* o)
166{
167ImgMagObj* img = dynamic_cast<ImgMagObj *>(o);
168if (img) return ( new NOMAdapter_ImgMag(img) );
169return ( new NObjMgrAdapter(o) );
170}
171string NOMAdapter_ImgMag::GetDataObjType()
172{
173 return ("ImgMagObj ");
174}
175
176/* --Methode-- */
177void NOMAdapter_ImgMag::Print(ostream& os, int lev)
178{
179 if (mImg == NULL) return;
180 os << " ImgMagObj - File=" << mImg->fileName() << " Width=" << mImg->columns()
181 << " x Height=" << mImg->rows() << endl;
182// if (lev > 1)
183}
184
185/* --Methode-- */
186P2DArrayAdapter* NOMAdapter_ImgMag::Get2DArray(string& dopt)
187{
188 if (mImg == NULL) return NULL;
189 if (dopt.find("monochrome") < dopt.length()) {
190 dopt = "lut=lin,0.,1. grey128 " + dopt;
191 return new ImgMagP2DAdaptGS(mImg);
192 }
193 else {
194 dopt = "lut=rgb rgb32768cm " + dopt;
195 return new ImgMagP2DAdaptRGB(mImg);
196 }
197}
198
199/* --Methode-- */
200NTupleInterface* NOMAdapter_ImgMag::GetNTupleInterface(bool& adel)
201{
202 if (mImg == NULL) return NULL;
203 adel = true;
204 return( new NTupInt_ImgMag(mImg) );
205}
206
207
208// ---- Class Interface NTuple pour ImgMagObj
209
210/* --Methode-- */
211NTupInt_ImgMag::NTupInt_ImgMag(ImgMagObj* img)
212{
213 mImg = img;
214}
215
216/* --Methode-- */
217NTupInt_ImgMag::~NTupInt_ImgMag()
218{
219}
220
221/* --Methode-- */
222sa_size_t NTupInt_ImgMag::NbLines() const
223{
224 if (mImg) return( mImg->XSize()*mImg->YSize() );
225 else return 0;
226}
227
228/* --Methode-- */
229sa_size_t NTupInt_ImgMag::NbColumns() const
230{
231 return(6);
232}
233
234/* --Methode-- */
235r_8* NTupInt_ImgMag::GetLineD(sa_size_t n) const
236{
237 int i;
238 if ((n < 0) || (n >= (int)(mImg->XSize()*mImg->YSize()) ))
239 for(i=0; i<6; i++) mRet[i] = 0.;
240else {
241 int i = n%mImg->XSize();
242 int j = n/mImg->XSize();
243 Magick::ColorRGB rgb = mImg->pixelColor(i, j);
244 Magick::ColorGray grey = mImg->pixelColor(i, j);
245 mRet[0] = i; mRet[1] = j;
246 mRet[2] = rgb.red();
247 mRet[3] = rgb.green();
248 mRet[4] = rgb.blue();
249 mRet[5] = grey.shade();
250 }
251return(mRet);
252}
253
254/* --Methode-- */
255string NTupInt_ImgMag::VarList_C(const char* nx) const
256{
257string nomx;
258if (nx) nomx = nx;
259else nomx = "_xh_";
260string vardec = "double x,y,i,j,r,g,b,I; \n";
261vardec += "x = " + nomx + "[0]; i = " + nomx + "[0]; \n";
262vardec += "y = " + nomx + "[1]; j = " + nomx + "[1]; \n";
263vardec += "r = " + nomx + "[2]; g = " + nomx + "[3]; \n";
264vardec += "b = " + nomx + "[4]; I = " + nomx + "[5]; \n";
265return(vardec);
266}
267
268
269
Note: See TracBrowser for help on using the repository browser.