+/*=========================================================================
+ Program: vv http://www.creatis.insa-lyon.fr/rio/vv
+
+ Authors belong to:
+ - University of LYON http://www.universite-lyon.fr/
+ - Léon Bérard cancer center http://www.centreleonberard.fr
+ - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
-/*-------------------------------------------------------------------------
-
- Program: clitk
- Language: C++
-
- Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
- l'Image). All rights reserved. See Doc/License.txt or
- http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
-
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notices for more information.
-
- -------------------------------------------------------------------------*/
+ PURPOSE. See the copyright notices for more information.
+ It is distributed under dual licence
+ - BSD See included LICENSE.txt file
+ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+===========================================================================**/
#ifndef CLITKHISIMAGEIO_CXX
#define CLITKHISIMAGEIO_CXX
-
#define HEADER_INFO_SIZE 68
-
/**
-------------------------------------------------
* @file clitkHisImageIO.cxx
* @author Simon Rit <simon.rit@gmail.com>
* @date 16 Feb 2010
- *
- * @brief
- *
- *
+ *
+ * @brief
+ *
+ *
-------------------------------------------------*/
// Based on a true story by the Nederlands Kanker Instituut (AVS_HEIMANN.CPP from the 20090608)
//--------------------------------------------------------------------
// Read Image Information
-void clitk::HisImageIO::ReadImageInformation() {
+void clitk::HisImageIO::ReadImageInformation()
+{
// open file
std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
if ( file.fail() )
itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
// read header
- char header[HEADER_INFO_SIZE];\r
- file.read(header, HEADER_INFO_SIZE);\r
-\r
- if (header[0]!=0 || header[1]!=112 || header[2]!=68 || header[3]!=0)\r
- { itkExceptionMacro(<< "clitk::HisImageIO::ReadImageInformation: file " << m_FileName << " not in Heimann HIS format version 100");\r
- return;\r
- }\r
-
- int nrframes, type, ulx, uly, brx, bry;\r
- m_HeaderSize = header[10] + (header[11]<<8);\r
- ulx = header[12] + (header[13]<<8);\r
- uly = header[14] + (header[15]<<8);\r
- brx = header[16] + (header[17]<<8);\r
- bry = header[18] + (header[19]<<8);\r
- nrframes = header[20] + (header[21]<<8);\r
- type = header[32] + (header[34]<<8);\r
-\r
- switch(type)\r
- { case 4: SetComponentType(itk::ImageIOBase::USHORT); break;\r
-// case 8: SetComponentType(itk::ImageIOBase::INT); break;\r
-// case 16: SetComponentType(itk::ImageIOBase::FLOAT); break;\r
-// case 32: SetComponentType(itk::ImageIOBase::INT); break;\r
- default: SetComponentType(itk::ImageIOBase::USHORT); break;\r
- }\r
-
- switch(nrframes)
- { case 1: SetNumberOfDimensions(2); break;
- default: SetNumberOfDimensions(3); break;
+ char header[HEADER_INFO_SIZE];
+ file.read(header, HEADER_INFO_SIZE);
+
+ if (header[0]!=0 || header[1]!=112 || header[2]!=68 || header[3]!=0) {
+ itkExceptionMacro(<< "clitk::HisImageIO::ReadImageInformation: file " << m_FileName << " not in Heimann HIS format version 100");
+ return;
+ }
+
+ int nrframes, type, ulx, uly, brx, bry;
+ m_HeaderSize = header[10] + (header[11]<<8);
+ ulx = header[12] + (header[13]<<8);
+ uly = header[14] + (header[15]<<8);
+ brx = header[16] + (header[17]<<8);
+ bry = header[18] + (header[19]<<8);
+ nrframes = header[20] + (header[21]<<8);
+ type = header[32] + (header[34]<<8);
+
+ switch(type) {
+ case 4:
+ SetComponentType(itk::ImageIOBase::USHORT);
+ break;
+// case 8: SetComponentType(itk::ImageIOBase::INT); break;
+// case 16: SetComponentType(itk::ImageIOBase::FLOAT); break;
+// case 32: SetComponentType(itk::ImageIOBase::INT); break;
+ default:
+ SetComponentType(itk::ImageIOBase::USHORT);
+ break;
+ }
+
+ switch(nrframes) {
+ case 1:
+ SetNumberOfDimensions(2);
+ break;
+ default:
+ SetNumberOfDimensions(3);
+ break;
}
SetDimensions(0, bry-uly+1);
SetDimensions(1, brx-ulx+1);
- if (nrframes>1)\r
- SetDimensions(2, nrframes);\r
+ if (nrframes>1)
+ SetDimensions(2, nrframes);
+
+ SetSpacing(0, 409.6/GetDimensions(0));
+ SetSpacing(1, 409.6/GetDimensions(1));
+
+ SetOrigin(0, -0.5*(GetDimensions(0)-1)*GetSpacing(0));
+ SetOrigin(1, -0.5*(GetDimensions(1)-1)*GetSpacing(1));
} ////
//--------------------------------------------------------------------
// Read Image Information
-bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
+bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
{
std::string filename(FileNameToRead);
std::string filenameext = GetExtension(filename);
//--------------------------------------------------------------------
// Read Image Content
-void clitk::HisImageIO::Read(void * buffer) {
+void clitk::HisImageIO::Read(void * buffer)
+{
// open file
std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
if ( file.fail() )
if ( file.fail() )
itkExceptionMacro(<<"File seek failed (His Read)");
-\r
- file.read((char*)buffer, GetImageSizeInBytes());\r
+
+ file.read((char*)buffer, GetImageSizeInBytes());
if ( file.fail() )
itkExceptionMacro(<<"Read failed: Wanted "
<< GetImageSizeInBytes()
<< file.gcount() << " bytes. The current state is: "
<< file.rdstate());
}
-
+
//--------------------------------------------------------------------
bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
-{ std::string filename(FileNameToWrite);
+{
+ std::string filename(FileNameToWrite);
std::string filenameext = GetExtension(filename);
if (filenameext != std::string("his")) return false;
return true;
if ( file.fail() )
itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
- m_HeaderSize = HEADER_INFO_SIZE + 32;\r
- char szHeader[HEADER_INFO_SIZE + 32] = {\r
- 0x00, 0x70, 0x44, 0x00, 0x64, 0x00, 0x64, 0x00, 0x20, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,\r
- 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x18, 0x41,\r
- 0x04, 0x00, 0x40, 0x5F, 0x48, 0x01, 0x40, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\r
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x63, 0x13, 0x00, 0xE8, 0x51, 0x13, 0x00, 0x5C, 0xE7, 0x12, 0x00,\r
- 0xFE, 0x2A, 0x49, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
- 0x00, 0x00, 0x00, 0x00};\r
-\r
- /* Fill into the header the essentials\r
- The 'iheader' in previous module is fixed to 0x20, and is included in szHeader.\r
- The 'ulx' and 'uly' are fixed to 0x01, so that 'brx' and 'bry' reflect the dimensions of\r
- the image.\r
- */\r
- const unsigned int ndim = GetNumberOfDimensions();\r
- if ((ndim < 2) || (ndim > 3))\r
- itkExceptionMacro( <<"Only 2D or 3D support");\r
-\r
- szHeader[16] = (char)(GetDimensions(0) % 256); // X-size lsb\r
- szHeader[17] = (char)(GetDimensions(0) / 256); // X-size msb\r
- szHeader[18] = (char)(GetDimensions(1) % 256); // Y-size lsb\r
- szHeader[19] = (char)(GetDimensions(1) / 256); // Y-size msb\r
- if (ndim == 3)\r
- { szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb\r
- szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb\r
- }\r
-\r
- switch (GetComponentType())\r
- { case itk::ImageIOBase::USHORT:\r
- szHeader[32] = 4;\r
- break;\r
- //case AVS_TYPE_INTEGER:\r
- // szHeader[32] = 8;\r
- // break;\r
- //case AVS_TYPE_REAL:\r
- // szHeader[32] = 16;\r
- // break;\r
- default:\r
- itkExceptionMacro(<< "Unsupported field type");\r
- break;\r
- }\r
-\r
- file.write(szHeader, m_HeaderSize);\r
- file.write((const char *)buffer, GetImageSizeInBytes());\r
+ m_HeaderSize = HEADER_INFO_SIZE + 32;
+ char szHeader[HEADER_INFO_SIZE + 32] = {
+ 0x00, 0x70, 0x44, 0x00, 0x64, 0x00, 0x64, 0x00, 0x20, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,
+ 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x18, 0x41,
+ 0x04, 0x00, 0x40, 0x5F, 0x48, 0x01, 0x40, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x63, 0x13, 0x00, 0xE8, 0x51, 0x13, 0x00, 0x5C, 0xE7, 0x12, 0x00,
+ 0xFE, 0x2A, 0x49, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ /* Fill into the header the essentials
+ The 'iheader' in previous module is fixed to 0x20, and is included in szHeader.
+ The 'ulx' and 'uly' are fixed to 0x01, so that 'brx' and 'bry' reflect the dimensions of
+ the image.
+ */
+ const unsigned int ndim = GetNumberOfDimensions();
+ if ((ndim < 2) || (ndim > 3))
+ itkExceptionMacro( <<"Only 2D or 3D support");
+
+ szHeader[16] = (char)(GetDimensions(0) % 256); // X-size lsb
+ szHeader[17] = (char)(GetDimensions(0) / 256); // X-size msb
+ szHeader[18] = (char)(GetDimensions(1) % 256); // Y-size lsb
+ szHeader[19] = (char)(GetDimensions(1) / 256); // Y-size msb
+ if (ndim == 3) {
+ szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb
+ szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb
+ }
+
+ switch (GetComponentType()) {
+ case itk::ImageIOBase::USHORT:
+ szHeader[32] = 4;
+ break;
+ //case AVS_TYPE_INTEGER:
+ // szHeader[32] = 8;
+ // break;
+ //case AVS_TYPE_REAL:
+ // szHeader[32] = 16;
+ // break;
+ default:
+ itkExceptionMacro(<< "Unsupported field type");
+ break;
+ }
+
+ file.write(szHeader, m_HeaderSize);
+ file.write((const char *)buffer, GetImageSizeInBytes());
file.close();
} ////