Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vtkGdcmWriter.cxx File Reference

#include "gdcmFile.h"
#include "gdcmFileHelper.h"
#include "gdcmDebug.h"
#include "gdcmUtil.h"
#include "vtkGdcmWriter.h"
#include <vtkObjectFactory.h>
#include <vtkImageData.h>
#include <vtkPointData.h>
#include <vtkLookupTable.h>

Include dependency graph for vtkGdcmWriter.cxx:

Go to the source code of this file.

Defines

#define vtkFloatingPointType   float

Functions

 vtkCxxRevisionMacro (vtkGdcmWriter,"$Revision: 1.26 $") vtkStandardNewMacro(vtkGdcmWriter) vtkGdcmWriter
size_t ReverseData (vtkImageData *image, unsigned char **data)
void SetImageInformation (gdcm::FileHelper *file, vtkImageData *image)


Define Documentation

#define vtkFloatingPointType   float
 

Definition at line 31 of file vtkGdcmWriter.cxx.


Function Documentation

size_t ReverseData vtkImageData *  image,
unsigned char **  data
 

Copy the image and reverse the Y axis

Definition at line 84 of file vtkGdcmWriter.cxx.

Referenced by SetImageInformation().

00085 {
00086    int inc[3];
00087    int *extent = image->GetUpdateExtent();
00088    int dim[3] = {extent[1]-extent[0]+1,
00089                  extent[3]-extent[2]+1,
00090                  extent[5]-extent[4]+1};
00091 
00092    size_t lineSize = dim[0] * image->GetScalarSize()
00093                    * image->GetNumberOfScalarComponents();
00094    size_t planeSize = dim[1] * lineSize;
00095    size_t size = dim[2] * planeSize;
00096 
00097    if( size>0 )
00098    {
00099       *data = new unsigned char[size];
00100 
00101       image->GetIncrements(inc);
00102       unsigned char *src = (unsigned char *)image->GetScalarPointerForExtent(extent);
00103       unsigned char *dst = *data + planeSize - lineSize;
00104       for (int plane = extent[4]; plane <= extent[5]; plane++)
00105       {
00106          for (int line = extent[2]; line <= extent[3]; line++)
00107          {
00108             // Copy one line at proper destination:
00109             memcpy((void*)dst, (void*)src, lineSize);
00110 
00111             src += inc[1] * image->GetScalarSize();
00112             dst -= lineSize;
00113          }
00114          dst += 2 * planeSize;
00115       }
00116    }
00117    else
00118    {
00119       *data = NULL;
00120    }
00121 
00122    return size;
00123 }

void SetImageInformation gdcm::FileHelper file,
vtkImageData *  image
 

Set the data informations in the file

Todo:
: Spacing Between Slices is meaningfull ONLY for CT an MR modality We should perform some checkings before forcing the Entry creation
Todo:
: Image Position Patient is meaningfull ONLY for CT an MR modality We should perform some checkings before forcing the Entry creation

Definition at line 128 of file vtkGdcmWriter.cxx.

References gdcm::FileHelper::InsertEntryString(), ReverseData(), gdcm::FileHelper::SetUserData(), and vtkFloatingPointType.

Referenced by vtkGdcmWriter::WriteDcmFile().

00129 {
00130    std::ostringstream str;
00131 
00132    // Image size
00133    int *extent = image->GetUpdateExtent();
00134    int dim[3] = {extent[1]-extent[0]+1,
00135                  extent[3]-extent[2]+1,
00136                  extent[5]-extent[4]+1};
00137 
00138    str.str("");
00139    str << dim[0];
00140    file->InsertEntryString(str.str(),0x0028,0x0011); // Columns
00141 
00142    str.str("");
00143    str << dim[1];
00144    file->InsertEntryString(str.str(),0x0028,0x0010); // Rows
00145 
00146    if(dim[2]>1)
00147    {
00148       str.str("");
00149       str << dim[2];
00150       //file->Insert(str.str(),0x0028,0x0012); // Planes
00151       file->InsertEntryString(str.str(),0x0028,0x0008); // Number of Frames
00152    }
00153 
00154    // Pixel type
00155    str.str("");
00156    str << image->GetScalarSize()*8;
00157    file->InsertEntryString(str.str(),0x0028,0x0100); // Bits Allocated
00158    file->InsertEntryString(str.str(),0x0028,0x0101); // Bits Stored
00159 
00160    str.str("");
00161    str << image->GetScalarSize()*8-1;
00162    file->InsertEntryString(str.str(),0x0028,0x0102); // High Bit
00163 
00164    // Pixel Repr
00165    // FIXME : what do we do when the ScalarType is 
00166    // VTK_UNSIGNED_INT or VTK_UNSIGNED_LONG
00167    str.str("");
00168    if( image->GetScalarType() == VTK_UNSIGNED_CHAR  ||
00169        image->GetScalarType() == VTK_UNSIGNED_SHORT ||
00170        image->GetScalarType() == VTK_UNSIGNED_INT   ||
00171        image->GetScalarType() == VTK_UNSIGNED_LONG )
00172    {
00173       str << "0"; // Unsigned
00174    }
00175    else
00176    {
00177       str << "1"; // Signed
00178    }
00179    file->InsertEntryString(str.str(),0x0028,0x0103); // Pixel Representation
00180 
00181    // Samples per pixel
00182    str.str("");
00183    str << image->GetNumberOfScalarComponents();
00184    file->InsertEntryString(str.str(),0x0028,0x0002); // Samples per Pixel
00185 
00188 
00189    // Spacing
00190    vtkFloatingPointType *sp = image->GetSpacing();
00191 
00192    str.str("");
00193    // We are about to enter floating point value. 
00194    // By default ostringstream are smart and don't do fixed point
00195    // thus forcing to fixed point value
00196    str.setf( std::ios::fixed );
00197    str << sp[1] << "\\" << sp[0];
00198    file->InsertEntryString(str.str(),0x0028,0x0030); // Pixel Spacing
00199    str.str("");
00200    str << sp[2];
00201    file->InsertEntryString(str.str(),0x0018,0x0088); // Spacing Between Slices
00202 
00203    // Origin
00204    vtkFloatingPointType *org = image->GetOrigin();
00205 
00208 
00209    str.str("");
00210    str << org[0] << "\\" << org[1] << "\\" << org[2];
00211    file->InsertEntryString(str.str(),0x0020,0x0032); // Image Position Patient
00212    str.unsetf( std::ios::fixed ); //done with floating point values
00213 
00214    // Window / Level
00215    vtkFloatingPointType *rng = image->GetScalarRange();
00216 
00217    str.str("");
00218    str << rng[1]-rng[0];
00219    file->InsertEntryString(str.str(),0x0028,0x1051); // Window Width
00220    str.str("");
00221    str << (rng[1]+rng[0])/2.0;
00222    file->InsertEntryString(str.str(),0x0028,0x1050); // Window Center
00223 
00224    // Pixels
00225    unsigned char *data;
00226    size_t size = ReverseData(image,&data);
00227    file->SetUserData(data,size);
00228 }

vtkCxxRevisionMacro vtkGdcmWriter  ,
"$Revision: 1.26 $" 
 

Definition at line 34 of file vtkGdcmWriter.cxx.

References VTK_GDCM_WRITE_TYPE_EXPLICIT_VR.

00034                                              : 1.26 $")
00035 vtkStandardNewMacro(vtkGdcmWriter)
00036 
00037 //-----------------------------------------------------------------------------
00038 // Constructor / Destructor
00039 vtkGdcmWriter::vtkGdcmWriter()
00040 {
00041    this->LookupTable = NULL;
00042    this->FileDimensionality = 3;
00043    this->WriteType = VTK_GDCM_WRITE_TYPE_EXPLICIT_VR;
00044 }


Generated on Fri Jan 20 10:14:29 2006 for gdcm by  doxygen 1.4.4