00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImageIOBase_h
00018 #define __itkImageIOBase_h
00019
00020 #include "itkLightProcessObject.h"
00021 #include "itkObjectFactory.h"
00022 #include "itkIndent.h"
00023 #include "itkImageIORegion.h"
00024 #include <string>
00025
00026 namespace itk
00027 {
00028
00055 class ITK_EXPORT ImageIOBase : public LightProcessObject
00056 {
00057 public:
00059 typedef ImageIOBase Self;
00060 typedef LightProcessObject Superclass;
00061 typedef SmartPointer<Self> Pointer;
00062
00064 itkTypeMacro(ImageIOBase, Superclass);
00065
00067 itkSetStringMacro(FileName);
00068 itkGetStringMacro(FileName);
00069
00071 class UnknownType {};
00072
00075 typedef enum {UNKNOWN,UCHAR,CHAR,USHORT,SHORT,UINT,INT,
00076 ULONG,LONG, FLOAT,DOUBLE,
00077 RGB,RGBA,OFFSET,VECTOR,POINT,COVARIANTVECTOR} IODataType;
00078
00082 void SetNumberOfDimensions(unsigned int);
00083 itkGetMacro(NumberOfDimensions, unsigned int);
00084
00088 virtual void SetDimensions(unsigned int i, unsigned int dim);
00089 virtual unsigned int GetDimensions(unsigned int i) const
00090 { return m_Dimensions[i]; }
00091
00094 virtual void SetOrigin(unsigned int i, double origin);
00095 virtual double GetOrigin(unsigned int i) const
00096 { return m_Origin[i]; }
00097
00100 virtual void SetSpacing(unsigned int i, double spacing);
00101 virtual double GetSpacing(unsigned int i) const
00102 { return m_Spacing[i]; }
00103
00110 itkSetMacro(IORegion, ImageIORegion);
00111 itkGetMacro(IORegion, ImageIORegion);
00112
00117 virtual const std::type_info& GetPixelType() const;
00118 virtual void SetPixelType(const IODataType ctype);
00119
00123 virtual bool SetPixelType(const std::type_info& ptype);
00124
00128 itkSetMacro(ComponentType,IODataType);
00129 itkGetMacro(ComponentType,IODataType);
00130
00133 itkSetMacro(NumberOfComponents,unsigned int);
00134 itkGetMacro(NumberOfComponents,unsigned int);
00135
00138 std::string ReturnTypeAsString(IODataType) const;
00139
00142 typedef enum {ASCII,Binary,TypeNotApplicable} FileType;
00143
00146 typedef enum {BigEndian,LittleEndian,OrderNotApplicable} ByteOrder;
00147
00150 itkSetMacro(FileType,FileType);
00151 itkGetConstMacro(FileType,FileType);
00152 void SetFileTypeToASCII()
00153 { this->SetFileType(ASCII); }
00154 void SetFileTypeToBinary()
00155 { this->SetFileType(Binary); }
00156
00168 itkSetMacro(ByteOrder,ByteOrder);
00169 itkGetConstMacro(ByteOrder,ByteOrder);
00170 void SetByteOrderToBigEndian()
00171 { this->SetByteOrder(BigEndian); }
00172 void SetByteOrderToLittleEndian()
00173 { this->SetByteOrder(LittleEndian); }
00174
00177 virtual unsigned int GetPixelStride () const;
00178
00180 unsigned int GetImageSizeInPixels() const;
00181
00183 unsigned int GetImageSizeInBytes() const;
00184
00187 unsigned int GetImageSizeInComponents() const;
00188
00189
00190
00193 virtual bool CanReadFile(const char*) = 0;
00194
00197 virtual bool CanStreamRead() { return false; };
00198
00201 virtual void ReadImageInformation() = 0;
00202
00204 virtual void Read(void* buffer) = 0;
00205
00206
00207
00208
00211 virtual bool CanWriteFile(const char*) = 0;
00212
00215 virtual bool CanStreamWrite() { return false; };
00216
00219 virtual void WriteImageInformation() = 0;
00220
00224 virtual void Write( const void* buffer) = 0;
00225
00226
00227
00233 virtual bool SupportsDimension(unsigned long dim)
00234 {return (dim == 2);}
00235
00236 protected:
00237 ImageIOBase();
00238 ~ImageIOBase();
00239 void PrintSelf(std::ostream& os, Indent indent) const;
00240
00242 const std::type_info& ConvertToTypeInfo(IODataType ) const;
00243 unsigned int GetSizeOfType(IODataType ) const;
00244
00246 IODataType m_PixelType;
00247
00250 IODataType m_ComponentType;
00251
00253 ByteOrder m_ByteOrder;
00254 FileType m_FileType;
00255
00257 bool m_Initialized;
00258
00260 std::string m_FileName;
00261
00264 unsigned int m_NumberOfComponents;
00265
00267 unsigned int m_NumberOfDimensions;
00268
00271 ImageIORegion m_IORegion;
00272
00274 std::vector<unsigned int> m_Dimensions;
00275
00278 std::vector<double> m_Spacing;
00279
00281 std::vector<double> m_Origin;
00282
00285 std::vector<unsigned int> m_Strides;
00286
00288 virtual void Reset(const bool freeDynamic = true);
00289
00291 void Resize(const unsigned int numDimensions,
00292 const unsigned int* dimensions);
00293
00300 void ComputeStrides();
00301
00304 virtual unsigned int GetPixelSize() const;
00305
00310 virtual unsigned int GetComponentSize() const;
00311
00314 unsigned int GetComponentStride() const;
00315
00318 unsigned int GetRowStride () const;
00319
00322 unsigned int GetSliceStride () const;
00323
00325 void WriteBufferAsASCII(std::ostream& os, const void *buffer, IODataType ctype,
00326 unsigned int numComp);
00327
00329 void ReadBufferAsASCII(std::istream& os, void *buffer, IODataType ctype,
00330 unsigned int numComp);
00331
00333 bool ReadBufferAsBinary(std::istream& os, void *buffer, unsigned int numComp);
00334
00335 private:
00336 ImageIOBase(const Self&);
00337 void operator=(const Self&);
00338
00339 };
00340
00341 }
00342
00343 #endif // __itkImageIOBase_h