1 #include "Transparency.h"
7 //------------------------------------------------------------
8 Transparency::Transparency()
20 //------------------------------------------------------------
21 Transparency::~Transparency()
23 if (_newImage != NULL ) { _newImage->Delete(); }
26 //------------------------------------------------------------
27 void Transparency::calculateImage()
30 if(_image1!=NULL && _image2!=NULL)
35 // Information from image1
36 _image1->GetSpacing(spcImg1);
37 _image1->GetExtent(extImg1);
38 _type = _image1->GetScalarType();
40 // The Z dimension is 1 for a 2D image
41 dimImg1[0] = extImg1[1] - extImg1[0]+1;
42 dimImg1[1] = extImg1[3] - extImg1[2]+1;
47 // Information from image2
48 _image2->GetSpacing(spcImg2);
49 _image2->GetExtent(extImg2);
51 // The Z dimension is 1 for a 2D image
52 dimImg2[0] = extImg2[1] - extImg2[0]+1;
53 dimImg2[1] = extImg2[3] - extImg2[2]+1;
56 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
57 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
61 vtkImageResample *resample = vtkImageResample::New();
63 if(numPixelsImg1<numPixelsImg2)
65 resample->SetInput(_image1);
66 factorX = (double)extImg2[1]/extImg1[1];
67 factorY = (double)extImg2[3]/extImg1[3];
68 resample->SetAxisMagnificationFactor(0,factorX);
69 resample->SetAxisMagnificationFactor(1,factorY);
70 resample->SetInformationInput(_image2);
72 initialize(dimImg2, spcImg2);
73 result = resample->GetOutput();
75 createImage(result,_image2,dimImg2[0],dimImg2[1]);
78 else if (numPixelsImg1>numPixelsImg2)
80 resample->SetInput(_image2);
81 factorX = (double)extImg1[1]/extImg2[1];
82 factorY = (double)extImg1[3]/extImg2[3];
83 resample->SetAxisMagnificationFactor(0,factorX);
84 resample->SetAxisMagnificationFactor(1,factorY);
85 resample->SetInformationInput(_image1);
87 initialize(dimImg1, spcImg1);
88 result = resample->GetOutput();
92 createImage(_image1,result,dimImg1[0],dimImg1[1]);
96 //If both images have the same number of pixels, the resultant image will have the
97 //properties of the first image.
98 resample->SetInput(_image2);
99 factorX = (double)extImg1[1]/extImg2[1];
100 factorY = (double)extImg1[3]/extImg2[3];
101 resample->SetAxisMagnificationFactor(0,factorX);
102 resample->SetAxisMagnificationFactor(1,factorY);
103 resample->SetInformationInput(_image1);
105 initialize(dimImg1, spcImg1);
107 result = resample->GetOutput();
110 createImage(_image1,result,dimImg1[0],dimImg1[1]);
119 void Transparency::initialize(int dimensions[], double spacing[])
121 // Setting the new image
122 _newImage = vtkImageData::New();
123 _newImage->SetScalarType(_type);
124 _newImage->SetSpacing(spacing);
125 _newImage->SetDimensions(dimensions);
126 _newImage->AllocateScalars();
131 void Transparency::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
134 if(_type == VTK_CHAR)
137 char* dataImagePointer1 = NULL;
138 char* dataImagePointer2 = NULL;
139 char* dataImageResultPointer = NULL;
141 dataImagePointer1 = (char*) img1->GetScalarPointer(0,0,0);
142 dataImagePointer2 = (char*) img2->GetScalarPointer(0,0,0);
143 dataImageResultPointer = (char*) _newImage->GetScalarPointer(0,0,0);
144 for(i = 0; i < sizeX; i++)
146 for(j = 0; j < sizeY; j++)
148 dataImagePointer1 = (char*)img1->GetScalarPointer(i,j,0);
149 dataImagePointer2 = (char*)img2->GetScalarPointer(i,j,0);
150 dataImageResultPointer = (char*)_newImage->GetScalarPointer(i,j,0);
152 *dataImageResultPointer = (char)*dataImagePointer1*_percent + (char)*dataImagePointer2*(1-_percent);
156 else if(_type == VTK_SIGNED_CHAR)
159 signed char* dataImagePointer1 = NULL;
160 signed char* dataImagePointer2 = NULL;
161 signed char* dataImageResultPointer = NULL;
163 dataImagePointer1 = (signed char*) img1->GetScalarPointer(0,0,0);
164 dataImagePointer2 = (signed char*) img2->GetScalarPointer(0,0,0);
165 dataImageResultPointer = (signed char*) _newImage->GetScalarPointer(0,0,0);
166 for(i = 0; i < sizeX; i++)
168 for(j = 0; j < sizeY; j++)
170 dataImagePointer1 = (signed char*)img1->GetScalarPointer(i,j,0);
171 dataImagePointer2 = (signed char*)img2->GetScalarPointer(i,j,0);
172 dataImageResultPointer = (signed char*)_newImage->GetScalarPointer(i,j,0);
174 *dataImageResultPointer = (signed char)*dataImagePointer1*_percent + (signed char)*dataImagePointer2*(1-_percent);
178 else if(_type == VTK_UNSIGNED_CHAR)
181 unsigned char* dataImagePointer1 = NULL;
182 unsigned char* dataImagePointer2 = NULL;
183 unsigned char* dataImageResultPointer = NULL;
185 dataImagePointer1 = (unsigned char*) img1->GetScalarPointer(0,0,0);
186 dataImagePointer2 = (unsigned char*) img2->GetScalarPointer(0,0,0);
187 dataImageResultPointer = (unsigned char*) _newImage->GetScalarPointer(0,0,0);
188 for(i = 0; i < sizeX; i++)
190 for(j = 0; j < sizeY; j++)
192 dataImagePointer1 = (unsigned char*)img1->GetScalarPointer(i,j,0);
193 dataImagePointer2 = (unsigned char*)img2->GetScalarPointer(i,j,0);
194 dataImageResultPointer = (unsigned char*)_newImage->GetScalarPointer(i,j,0);
196 *dataImageResultPointer = (unsigned char)*dataImagePointer1*_percent + (unsigned char)*dataImagePointer2*(1-_percent);
200 else if(_type == VTK_SHORT)
203 short* dataImagePointer1 = NULL;
204 short* dataImagePointer2 = NULL;
205 short* dataImageResultPointer = NULL;
207 dataImagePointer1 = (short*) img1->GetScalarPointer(0,0,0);
208 dataImagePointer2 = (short*) img2->GetScalarPointer(0,0,0);
209 dataImageResultPointer = (short*) _newImage->GetScalarPointer(0,0,0);
210 for(i = 0; i < sizeX; i++)
212 for(j = 0; j < sizeY; j++)
214 dataImagePointer1 = (short*)img1->GetScalarPointer(i,j,0);
215 dataImagePointer2 = (short*)img2->GetScalarPointer(i,j,0);
216 dataImageResultPointer = (short*)_newImage->GetScalarPointer(i,j,0);
218 *dataImageResultPointer = (short)*dataImagePointer1*_percent + (short)*dataImagePointer2*(1-_percent);
222 else if(_type == VTK_UNSIGNED_SHORT)
225 unsigned short* dataImagePointer1 = NULL;
226 unsigned short* dataImagePointer2 = NULL;
227 unsigned short* dataImageResultPointer = NULL;
229 dataImagePointer1 = (unsigned short*) img1->GetScalarPointer(0,0,0);
230 dataImagePointer2 = (unsigned short*) img2->GetScalarPointer(0,0,0);
231 dataImageResultPointer = (unsigned short*) _newImage->GetScalarPointer(0,0,0);
232 for(i = 0; i < sizeX; i++)
234 for(j = 0; j < sizeY; j++)
236 dataImagePointer1 = (unsigned short*)img1->GetScalarPointer(i,j,0);
237 dataImagePointer2 = (unsigned short*)img2->GetScalarPointer(i,j,0);
238 dataImageResultPointer = (unsigned short*)_newImage->GetScalarPointer(i,j,0);
240 *dataImageResultPointer = (unsigned short)*dataImagePointer1*_percent + (unsigned short)*dataImagePointer2*(1-_percent);
244 else if(_type == VTK_INT)
247 int* dataImagePointer1 = NULL;
248 int* dataImagePointer2 = NULL;
249 int* dataImageResultPointer = NULL;
251 dataImagePointer1 = (int*) img1->GetScalarPointer(0,0,0);
252 dataImagePointer2 = (int*) img2->GetScalarPointer(0,0,0);
253 dataImageResultPointer = (int*) _newImage->GetScalarPointer(0,0,0);
254 for(i = 0; i < sizeX; i++)
256 for(j = 0; j < sizeY; j++)
258 dataImagePointer1 = (int*)img1->GetScalarPointer(i,j,0);
259 dataImagePointer2 = (int*)img2->GetScalarPointer(i,j,0);
260 dataImageResultPointer = (int*)_newImage->GetScalarPointer(i,j,0);
262 *dataImageResultPointer = (int)*dataImagePointer1*_percent + (int)*dataImagePointer2*(1-_percent);
266 else if(_type == VTK_UNSIGNED_INT)
269 unsigned int* dataImagePointer1 = NULL;
270 unsigned int* dataImagePointer2 = NULL;
271 unsigned int* dataImageResultPointer = NULL;
273 dataImagePointer1 = (unsigned int*) img1->GetScalarPointer(0,0,0);
274 dataImagePointer2 = (unsigned int*) img2->GetScalarPointer(0,0,0);
275 dataImageResultPointer = (unsigned int*) _newImage->GetScalarPointer(0,0,0);
276 for(i = 0; i < sizeX; i++)
278 for(j = 0; j < sizeY; j++)
280 dataImagePointer1 = (unsigned int*)img1->GetScalarPointer(i,j,0);
281 dataImagePointer2 = (unsigned int*)img2->GetScalarPointer(i,j,0);
282 dataImageResultPointer = (unsigned int*)_newImage->GetScalarPointer(i,j,0);
284 *dataImageResultPointer = (unsigned int)*dataImagePointer1*_percent + (unsigned int)*dataImagePointer2*(1-_percent);
288 else if(_type == VTK_LONG)
291 long* dataImagePointer1 = NULL;
292 long* dataImagePointer2 = NULL;
293 long* dataImageResultPointer = NULL;
295 dataImagePointer1 = (long*) img1->GetScalarPointer(0,0,0);
296 dataImagePointer2 = (long*) img2->GetScalarPointer(0,0,0);
297 dataImageResultPointer = (long*) _newImage->GetScalarPointer(0,0,0);
298 for(i = 0; i < sizeX; i++)
300 for(j = 0; j < sizeY; j++)
302 dataImagePointer1 = (long*)img1->GetScalarPointer(i,j,0);
303 dataImagePointer2 = (long*)img2->GetScalarPointer(i,j,0);
304 dataImageResultPointer = (long*)_newImage->GetScalarPointer(i,j,0);
306 *dataImageResultPointer = (long)*dataImagePointer1*_percent + (long)*dataImagePointer2*(1-_percent);
310 else if(_type == VTK_UNSIGNED_LONG)
313 unsigned long* dataImagePointer1 = NULL;
314 unsigned long* dataImagePointer2 = NULL;
315 unsigned long* dataImageResultPointer = NULL;
317 dataImagePointer1 = (unsigned long*) img1->GetScalarPointer(0,0,0);
318 dataImagePointer2 = (unsigned long*) img2->GetScalarPointer(0,0,0);
319 dataImageResultPointer = (unsigned long*) _newImage->GetScalarPointer(0,0,0);
320 for(i = 0; i < sizeX; i++)
322 for(j = 0; j < sizeY; j++)
324 dataImagePointer1 = (unsigned long*)img1->GetScalarPointer(i,j,0);
325 dataImagePointer2 = (unsigned long*)img2->GetScalarPointer(i,j,0);
326 dataImageResultPointer = (unsigned long*)_newImage->GetScalarPointer(i,j,0);
328 *dataImageResultPointer = (unsigned long)*dataImagePointer1*_percent + (unsigned long)*dataImagePointer2*(1-_percent);
332 else if(_type == VTK_FLOAT)
335 float* dataImagePointer1 = NULL;
336 float* dataImagePointer2 = NULL;
337 float* dataImageResultPointer = NULL;
339 dataImagePointer1 = (float*) img1->GetScalarPointer(0,0,0);
340 dataImagePointer2 = (float*) img2->GetScalarPointer(0,0,0);
341 dataImageResultPointer = (float*) _newImage->GetScalarPointer(0,0,0);
342 for(i = 0; i < sizeX; i++)
344 for(j = 0; j < sizeY; j++)
346 dataImagePointer1 = (float*)img1->GetScalarPointer(i,j,0);
347 dataImagePointer2 = (float*)img2->GetScalarPointer(i,j,0);
348 dataImageResultPointer = (float*)_newImage->GetScalarPointer(i,j,0);
350 *dataImageResultPointer = (float)*dataImagePointer1*_percent + (float)*dataImagePointer2*(1-_percent);
354 else if(_type == VTK_DOUBLE)
357 double* dataImagePointer1 = NULL;
358 double* dataImagePointer2 = NULL;
359 double* dataImageResultPointer = NULL;
361 dataImagePointer1 = (double*) img1->GetScalarPointer(0,0,0);
362 dataImagePointer2 = (double*) img2->GetScalarPointer(0,0,0);
363 dataImageResultPointer = (double*) _newImage->GetScalarPointer(0,0,0);
364 for(i = 0; i < sizeX; i++)
366 for(j = 0; j < sizeY; j++)
368 dataImagePointer1 = (double*)img1->GetScalarPointer(i,j,0);
369 dataImagePointer2 = (double*)img2->GetScalarPointer(i,j,0);
370 dataImageResultPointer = (double*)_newImage->GetScalarPointer(i,j,0);
372 *dataImageResultPointer = (double)*dataImagePointer1*_percent + (double)*dataImagePointer2*(1-_percent);
383 //------------------------------------------------------------
384 vtkImageData* Transparency::getImage()
394 //------------------------------------------------------------
395 void Transparency::setImage1(vtkImageData *image)
400 //------------------------------------------------------------
401 void Transparency::setImage2(vtkImageData *image)
406 //------------------------------------------------------------
407 void Transparency::setPercent(int percent)
409 _percent=(double)percent/100.0;