#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) |
|
Definition at line 31 of file vtkGdcmWriter.cxx. |
|
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 }
|
|
Set the data informations in the file
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 }
|
|
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 }
|