--- /dev/null
+#include "Transparency.h"
+
+
+/*
+* Constructor
+*/
+//------------------------------------------------------------
+Transparency::Transparency()
+{
+ _image1=NULL;
+ _image2=NULL;
+ _percent=0;
+ _newImage = NULL;
+ _processed=false;
+}
+
+/*
+* Destructor
+*/
+//------------------------------------------------------------
+Transparency::~Transparency()
+{
+ if (_newImage != NULL ) { _newImage->Delete(); }
+}
+
+//------------------------------------------------------------
+void Transparency::calculateImage()
+{
+
+ if(_image1!=NULL && _image2!=NULL)
+ {
+
+ // IMAGE 1
+
+ // Information from image1
+ _image1->GetSpacing(spcImg1);
+ _image1->GetExtent(extImg1);
+ _type = _image1->GetScalarType();
+
+ // The Z dimension is 1 for a 2D image
+ dimImg1[0] = extImg1[1] - extImg1[0]+1;
+ dimImg1[1] = extImg1[3] - extImg1[2]+1;
+ dimImg1[2] = 1;
+
+ //IMAGE 2
+
+ // Information from image2
+ _image2->GetSpacing(spcImg2);
+ _image2->GetExtent(extImg2);
+
+ // The Z dimension is 1 for a 2D image
+ dimImg2[0] = extImg2[1] - extImg2[0]+1;
+ dimImg2[1] = extImg2[3] - extImg2[2]+1;
+ dimImg2[2] = 1;
+
+ long numPixelsImg1 = dimImg1[0]*dimImg1[1];
+ long numPixelsImg2 = dimImg2[0]*dimImg2[1];
+
+ double factorX = 1;
+ double factorY = 1;
+ vtkImageResample *resample = vtkImageResample::New();
+ vtkImageData *result;
+ if(numPixelsImg1<numPixelsImg2)
+ {
+ resample->SetInput(_image1);
+ factorX = (double)extImg2[1]/extImg1[1];
+ factorY = (double)extImg2[3]/extImg1[3];
+ resample->SetAxisMagnificationFactor(0,factorX);
+ resample->SetAxisMagnificationFactor(1,factorY);
+ resample->SetInformationInput(_image2);
+
+ initialize(dimImg2, spcImg2);
+ result = resample->GetOutput();
+ result->Update();
+ createImage(result,_image2,dimImg2[0],dimImg2[1]);
+
+ } //if
+ else if (numPixelsImg1>numPixelsImg2)
+ {
+ resample->SetInput(_image2);
+ factorX = (double)extImg1[1]/extImg2[1];
+ factorY = (double)extImg1[3]/extImg2[3];
+ resample->SetAxisMagnificationFactor(0,factorX);
+ resample->SetAxisMagnificationFactor(1,factorY);
+ resample->SetInformationInput(_image1);
+
+ initialize(dimImg1, spcImg1);
+ result = resample->GetOutput();
+
+ result->Update();
+
+ createImage(_image1,result,dimImg1[0],dimImg1[1]);
+ } // else if
+ else
+ {
+ //If both images have the same number of pixels, the resultant image will have the
+ //properties of the first image.
+ resample->SetInput(_image2);
+ factorX = (double)extImg1[1]/extImg2[1];
+ factorY = (double)extImg1[3]/extImg2[3];
+ resample->SetAxisMagnificationFactor(0,factorX);
+ resample->SetAxisMagnificationFactor(1,factorY);
+ resample->SetInformationInput(_image1);
+
+ initialize(dimImg1, spcImg1);
+
+ result = resample->GetOutput();
+ result->Update();
+
+ createImage(_image1,result,dimImg1[0],dimImg1[1]);
+
+ } //else
+
+ resample->Delete();
+ _processed=true;
+ }
+}
+
+void Transparency::initialize(int dimensions[], double spacing[])
+{
+ // Setting the new image
+ _newImage = vtkImageData::New();
+ _newImage->SetScalarType(_type);
+ _newImage->SetSpacing(spacing);
+ _newImage->SetDimensions(dimensions);
+ _newImage->AllocateScalars();
+ _newImage->Update();
+
+}
+
+void Transparency::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
+{
+ int i, j;
+ if(_type == VTK_CHAR)
+ {
+ //POINTERS:
+ char* dataImagePointer1 = NULL;
+ char* dataImagePointer2 = NULL;
+ char* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (char*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (char*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (char*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (char*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (char*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (char*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (char)*dataImagePointer1*_percent + (char)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_SIGNED_CHAR)
+ {
+ //POINTERS:
+ signed char* dataImagePointer1 = NULL;
+ signed char* dataImagePointer2 = NULL;
+ signed char* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (signed char*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (signed char*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (signed char*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (signed char*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (signed char*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (signed char*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (signed char)*dataImagePointer1*_percent + (signed char)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_UNSIGNED_CHAR)
+ {
+ //POINTERS:
+ unsigned char* dataImagePointer1 = NULL;
+ unsigned char* dataImagePointer2 = NULL;
+ unsigned char* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (unsigned char*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (unsigned char*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (unsigned char*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (unsigned char*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (unsigned char*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (unsigned char*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (unsigned char)*dataImagePointer1*_percent + (unsigned char)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_SHORT)
+ {
+ //POINTERS:
+ short* dataImagePointer1 = NULL;
+ short* dataImagePointer2 = NULL;
+ short* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (short*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (short*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (short*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (short*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (short*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (short*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (short)*dataImagePointer1*_percent + (short)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_UNSIGNED_SHORT)
+ {
+ //POINTERS:
+ unsigned short* dataImagePointer1 = NULL;
+ unsigned short* dataImagePointer2 = NULL;
+ unsigned short* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (unsigned short*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (unsigned short*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (unsigned short*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (unsigned short*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (unsigned short*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (unsigned short*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (unsigned short)*dataImagePointer1*_percent + (unsigned short)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_INT)
+ {
+ //POINTERS:
+ int* dataImagePointer1 = NULL;
+ int* dataImagePointer2 = NULL;
+ int* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (int*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (int*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (int*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (int*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (int*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (int*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (int)*dataImagePointer1*_percent + (int)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_UNSIGNED_INT)
+ {
+ //POINTERS:
+ unsigned int* dataImagePointer1 = NULL;
+ unsigned int* dataImagePointer2 = NULL;
+ unsigned int* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (unsigned int*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (unsigned int*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (unsigned int*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (unsigned int*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (unsigned int*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (unsigned int*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (unsigned int)*dataImagePointer1*_percent + (unsigned int)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_LONG)
+ {
+ //POINTERS:
+ long* dataImagePointer1 = NULL;
+ long* dataImagePointer2 = NULL;
+ long* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (long*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (long*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (long*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (long*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (long*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (long*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (long)*dataImagePointer1*_percent + (long)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_UNSIGNED_LONG)
+ {
+ //POINTERS:
+ unsigned long* dataImagePointer1 = NULL;
+ unsigned long* dataImagePointer2 = NULL;
+ unsigned long* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (unsigned long*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (unsigned long*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (unsigned long*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (unsigned long*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (unsigned long*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (unsigned long*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (unsigned long)*dataImagePointer1*_percent + (unsigned long)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_FLOAT)
+ {
+ //POINTERS:
+ float* dataImagePointer1 = NULL;
+ float* dataImagePointer2 = NULL;
+ float* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (float*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (float*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (float*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (float*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (float*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (float*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (float)*dataImagePointer1*_percent + (float)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+ else if(_type == VTK_DOUBLE)
+ {
+ //POINTERS:
+ double* dataImagePointer1 = NULL;
+ double* dataImagePointer2 = NULL;
+ double* dataImageResultPointer = NULL;
+
+ dataImagePointer1 = (double*) img1->GetScalarPointer(0,0,0);
+ dataImagePointer2 = (double*) img2->GetScalarPointer(0,0,0);
+ dataImageResultPointer = (double*) _newImage->GetScalarPointer(0,0,0);
+ for(i = 0; i < sizeX; i++)
+ {
+ for(j = 0; j < sizeY; j++)
+ {
+ dataImagePointer1 = (double*)img1->GetScalarPointer(i,j,0);
+ dataImagePointer2 = (double*)img2->GetScalarPointer(i,j,0);
+ dataImageResultPointer = (double*)_newImage->GetScalarPointer(i,j,0);
+
+ *dataImageResultPointer = (double)*dataImagePointer1*_percent + (double)*dataImagePointer2*(1-_percent);
+ }
+ }
+ }
+
+ _newImage->Update();
+}
+
+/*
+* Get new image
+*/
+//------------------------------------------------------------
+vtkImageData* Transparency::getImage()
+{
+ if(_processed){
+ return _newImage;
+ }
+ else{
+ return NULL;
+ }
+}
+
+//------------------------------------------------------------
+void Transparency::setImage1(vtkImageData *image)
+{
+ _image1=image;
+}
+
+//------------------------------------------------------------
+void Transparency::setImage2(vtkImageData *image)
+{
+ _image2=image;
+}
+
+//------------------------------------------------------------
+void Transparency::setPercent(int percent)
+{
+ _percent=(double)percent/100.0;
+}
\ No newline at end of file