76 #include "vtkObjectFactory.h"
77 #include "vtkImageData.h"
78 #include "vtkSource.h"
79 #include "vtkPointData.h"
80 #include "vtkByteSwap.h"
81 #include "vtkInformation.h"
82 #include "vtkInformationVector.h"
83 #include "vtkStreamingDemandDrivenPipeline.h"
87 #define PRT_EXT(ext) ext[0], ext[1], ext[2], ext[3], ext[4], ext[5]
88 #define PRT_EXT2(ext) ext[0] << "," << ext[1] << "," << ext[2] << "," << ext[3] << "," << ext[4] << "," << ext[5]
90 #define CLEAR_CODE 256
99 this->SetNumberOfInputPorts(0);
100 this->SetNumberOfOutputPorts(1);
107 #ifdef VTK_WORDS_BIGENDIAN
192 this->
FileName =
new char[strlen(name) + 1];
252 vtkErrorMacro(<<
"FileName must be specified.");
266 this->
File =
new ifstream(this->
FileName, ios::in | ios::binary);
270 if ( !this->
File || this->
File->fail() )
272 vtkErrorMacro(<<
"OpenFile: Could not open file " << this->
FileName);
280 #ifndef VTK_WORDS_BIGENDIAN
283 this->SwapBytesOff();
289 #ifdef VTK_WORDS_BIGENDIAN
292 this->SwapBytesOff();
310 #ifdef VTK_WORDS_BIGENDIAN
333 #ifdef VTK_WORDS_BIGENDIAN
336 return "LittleEndian";
349 return "LittleEndian";
358 vtkDebugMacro(<<
"GetChannelName: Illegal channel index!");
360 return const_cast< char *
>( std::string(
"").c_str() );
377 vtkDebugMacro(<<
"almost done\n");
379 vtkDebugMacro(<<
"done");
386 vtkDebugMacro(<<
"allocating space for " << chNum <<
"channel names");
390 vtkErrorMacro(<<
"Could not allocate memory for channel name table!");
393 for (
int i = 0; i < chNum; i++ )
413 size_t length = strlen(chName);
414 vtkDebugMacro(<<
"length=" << length);
415 name =
new char[length + 1];
418 vtkErrorMacro(<<
"Could not allocate memory for channel name");
421 strncpy(name, chName, length);
432 for ( i = 0; i < length; i++ )
434 ch = *( nameBuff + i );
442 vtkWarningMacro(<<
"Start of the channel name may not be found!");
452 for ( i = 0; i < length; i++ )
454 component = *( nameBuff + i );
455 *( buffer + i ) = component;
456 if ( component == 0 )
467 unsigned int dataType;
474 for (
unsigned int i = 0; i < numOfChls; i++ )
478 vtkDebugMacro(<<
"Channel " << i <<
" has datatype " << dataType <<
"\n");
485 int colNum, nameNum, sizeOfStructure, sizeOfNames, nameLength, nameSkip;
486 unsigned long colorOffset, nameOffset, pos;
487 char * nameBuff, *colorBuff, *name, *tempBuff;
488 unsigned char component;
490 colorBuff =
new char[5];
495 sizeOfStructure = this->
ReadInt(f, pos);
498 colNum = this->
ReadInt(f, pos);
500 nameNum = this->
ReadInt(f, pos);
502 sizeOfNames = sizeOfStructure - ( ( 10 * 4 ) + ( colNum * 4 ) );
504 nameBuff =
new char[sizeOfNames + 1];
505 name =
new char[sizeOfNames + 1];
509 vtkDebugMacro(<<
"Number of channel colors is not same as number of channels!");
510 vtkDebugMacro(<<
"numColors=" << colNum <<
", numChls=" << this->
GetNumberOfChannels() <<
", numNames=" << nameNum);
514 vtkDebugMacro(<<
"Number of channel names is not same as number of channels!");
515 vtkDebugMacro(<<
"numColors=" << colNum <<
", numChls=" << this->
GetNumberOfChannels() <<
", numNames=" << nameNum);
519 colorOffset = this->
ReadInt(f, pos) + start;
521 nameOffset = this->
ReadInt(f, pos) + start;
523 vtkDebugMacro(<<
"colorOffset=" << colorOffset);
524 vtkDebugMacro(<<
"nameOffset=" << nameOffset);
525 vtkDebugMacro(<<
"number of colors" << colNum);
527 this->
ChannelColors->SetNumberOfValues( 3 * ( colNum + 1 ) );
533 this->
ReadFile(f, colorOffset, 4, colorBuff, 1);
535 for (
int i = 0; i < 3; i++ )
543 this->
ReadFile(f, nameOffset, sizeOfNames, nameBuff, 1);
545 nameLength = nameSkip = 0;
550 nameLength = this->
ReadChannelName(tempBuff + nameSkip, sizeOfNames - nameSkip, name);
552 tempBuff += nameSkip + nameLength;
553 vtkDebugMacro(<<
"Setting channel " << i <<
"name");
565 int numOffStamps = 0;
569 vtkDebugMacro(<<
"No timestamp information available");
573 numOffStamps = this->
ReadInt(f, offset);
574 vtkDebugMacro(<<
"There are " << numOffStamps <<
" stamps available");
583 for (
int i = 0; i < numOffStamps; i++ )
596 unsigned long offset;
598 vtkDebugMacro(
"ReadLSMSpecificInfo(stream," << pos <<
")\n");
617 vtkDebugMacro(<<
"Number of Channels" << this->
Dimensions[4] <<
"\n");
630 vtkDebugMacro(<<
"Data type=" << this->
DataType <<
"\n");
657 vtkDebugMacro(
"ScanType" << this->
ScanType <<
"\n");
664 pos += 1 * 2 + 4 * 4;
668 vtkDebugMacro(<<
"Channel info offset (from addr" << pos <<
")=" << this->
ChannelInfoOffset <<
"\n");
686 printf(
"Scan information offset = %ld\n", scanInformationOffset);
699 unsigned int entry, type, size;
700 unsigned int subblocksOpen = 0;
702 double wavelength = 0.;
704 int chIsOn = 0, trackIsOn = 0, isOn = 0;
734 name =
new char[size + 1];
746 chName =
new char[size + 1];
747 this->
ReadData(f, pos, size, chName);
753 trackIsOn = this->
ReadInt(f, pos);
757 chName =
new char[size + 1];
758 this->
ReadData(f, pos, size, chName);
767 chName =
new char[size + 1];
768 this->
ReadData(f, pos, size, chName);
777 chIsOn = this->
ReadInt(f, pos);
838 if ( subblocksOpen == 0 ) {
break; }
847 char tempValue[4], tempValue2[4];
848 char *actualValue = NULL;
855 this->
ReadFile(f, startPos, 4, tempValue);
859 for ( i = 0; i < 4; i++ )
861 tempValue2[i] = tempValue[i];
864 #ifdef VTK_WORDS_BIGENDIAN
865 vtkByteSwap::Swap4LE( (
unsigned int *)tempValue2 );
872 unsigned int readSize = dataSize * length;
875 actualValue =
new char[readSize];
881 if ( this->
ReadFile(f, startPos, readSize, actualValue) == 0 )
883 vtkErrorMacro(<<
"Failed to get strip offsets\n");
890 actualValue =
new char[4];
891 for (
int o = 0; o < 4; o++ )
893 actualValue[o] = tempValue[o];
904 #ifdef VTK_WORDS_BIGENDIAN
905 vtkByteSwap::Swap4LE( (
unsigned int *)actualValue );
906 vtkDebugMacro(<<
"Image width=" << value);
913 #ifdef VTK_WORDS_BIGENDIAN
914 vtkByteSwap::Swap4LE( (
unsigned int *)actualValue );
916 vtkDebugMacro(<<
"Image length=" << value);
922 #ifdef VTK_WORDS_BIGENDIAN
923 vtkByteSwap::Swap2LE( (
unsigned short *)actualValue );
926 unsigned short bitsPerSample;
927 for ( i = 0; i < length; i++ )
935 #ifdef VTK_WORDS_BIGENDIAN
936 vtkByteSwap::Swap2LE( (
unsigned short *)actualValue );
942 #ifdef VTK_WORDS_BIGENDIAN
943 vtkByteSwap::Swap2LE( (
unsigned short *)actualValue );
951 #ifdef VTK_WORDS_BIGENDIAN
952 vtkByteSwap::Swap4LERange( (
unsigned int *)actualValue, length );
956 unsigned int *offsets =
957 static_cast< unsigned int *
>(
static_cast< void *
>( actualValue ) );
959 for ( i = 0; i < length; i++ )
962 unsigned int stripOffset = offsets[i];
975 #ifdef VTK_WORDS_BIGENDIAN
976 vtkByteSwap::Swap4LE( (
unsigned int *)actualValue );
983 #ifdef VTK_WORDS_BIGENDIAN
984 vtkByteSwap::Swap4LERange( (
unsigned int *)actualValue, length );
990 for ( i = 0; i < length; i++ )
1007 #ifdef VTK_WORDS_BIGENDIAN
1008 vtkByteSwap::Swap2LE( (
unsigned short *)actualValue );
1013 #ifdef VTK_WORDS_BIGENDIAN
1014 vtkByteSwap::Swap2LE( (
unsigned short *)actualValue );
1019 #ifdef VTK_WORDS_BIGENDIAN
1020 vtkByteSwap::Swap4LE( (
unsigned int *)actualValue );
1032 delete[] actualValue;
1068 vtkErrorMacro(<<
"Tried to get read size but table not constructed\n");
1077 vtkErrorMacro(<<
"Request slice offset but table not constructed\n");
1089 this->
ReadSizes = vtkUnsignedLongArray::New();
1092 this->
ReadSizes->SetNumberOfTuples(length);
1093 for (
int j = 0; j < length; j++ )
1100 unsigned long temp, offset, readSize;
1102 for (
int tp = 0; tp < this->
Dimensions[3]; tp++ )
1104 for (
int slice = 0; slice < this->Dimensions[2]; slice++ )
1106 temp = tp * this->Dimensions[2] + slice;
1111 this->
ReadSizes->SetValue(temp, readSize);
1118 unsigned long temp = slice + ( timepoint * this->
Dimensions[2] );
1125 unsigned long offset = 4, finalOffset;
1127 unsigned long i = 0;
1129 unsigned long imageCount = image + 1;
1141 vtkDebugMacro(<<
"offset (from file): " << offset <<
"\n");
1156 finalOffset = offset;
1161 while ( i < imageCount && offset != 0 );
1171 unsigned short numberOfTags = 0;
1172 unsigned long nextOffset = offset;
1176 for (
int i = 0; i < numberOfTags; i++ )
1185 offset = offset + 12;
1188 nextOffset += 2 + numberOfTags * 12;
1196 for (
int i = 1; i < size; i++ )
1198 *( buffer + i ) = *( buffer + i ) + *( buffer + i - 1 );
1208 for (
int i = 1; i < size; i++ )
1210 *( buffer + i ) = *( buffer + i ) + *( buffer + i - 1 );
1220 <<
"vtkLSMReader does not handle LZW Compression anymore for license issue");
1280 vtkInformation *vtkNotUsed(request),
1281 vtkInformationVector **vtkNotUsed(inputVector),
1282 vtkInformationVector *outputVector)
1284 unsigned long offset;
1289 vtkDebugMacro(<<
"Constructing slice offset table\n");
1294 vtkInformation *outInfo = outputVector->GetInformationObject(0);
1295 vtkImageData * data = this->AllocateOutputData( outInfo->Get( vtkDataObject::DATA_OBJECT() ) );
1296 data->GetPointData()->GetScalars()->SetName(
"LSM Scalars");
1297 data->GetExtent(outExtent);
1301 vtkDebugMacro(<<
"Can not execute data since information has not been executed!");
1305 <<
"Update extent: " << outExtent[0] <<
", " << outExtent[1] <<
", " << outExtent[2] <<
", " << outExtent[3]
1306 <<
", " << outExtent[4] <<
"," << outExtent[5] <<
"\n");
1316 unsigned int numberOfPixels = this->
Dimensions[0] * this->
Dimensions[1] * ( outExtent[5] - outExtent[4] + 1 );
1320 <<
"numberOfPixels=" << numberOfPixels <<
", buffer size=" << size <<
", datatype=" << dataType
1325 unsigned char *buf =
new unsigned char[size];
1326 unsigned char *tempBuf = buf;
1327 unsigned int readSize;
1329 time_t start = time (NULL);
1330 for (
int i = outExtent[4]; i <= outExtent[5]; ++i )
1333 readSize =
static_cast< unsigned int >( this->
GetStripByteCount(timepoint, i) );
1336 <<
"Offset to tp " << timepoint <<
", slice " << i <<
" = " << offset <<
", strip byte count: " << readSize
1339 for (
unsigned long ii = 0; ii < readSize; ii++ )
1344 std::streamsize bytes = this->
ReadFile(this->
GetFile(), offset, readSize,
1345 static_cast< char * >( static_cast< void * >( tempBuf ) ), 1);
1347 if ( static_cast< unsigned int >( bytes ) != readSize )
1349 vtkDebugMacro(<<
"Asked for " << readSize <<
" bytes, got " << bytes <<
"\n");
1350 vtkDebugMacro(<<
"File status: fail: " << this->
GetFile()->fail() <<
", eof: " << this->
GetFile()->eof() <<
"\n");
1357 tempBuf += readSize;
1359 time_t end = time (NULL);
1364 vtkDebugMacro(<<
"Dataset generation time: " << end - start);
1366 vtkUnsignedCharArray * uscarray;
1367 vtkUnsignedShortArray *ussarray;
1370 ussarray = vtkUnsignedShortArray::New();
1371 ussarray->SetNumberOfComponents(1);
1372 ussarray->SetNumberOfValues(numberOfPixels);
1374 ussarray->SetArray(static_cast< unsigned short * >( static_cast< void * >( buf ) ),
1376 data->GetPointData()->SetScalars(ussarray);
1382 uscarray = vtkUnsignedCharArray::New();
1383 uscarray->SetNumberOfComponents(1);
1384 uscarray->SetNumberOfValues(numberOfPixels);
1386 uscarray->SetArray(buf, numberOfPixels, 0);
1387 data->GetPointData()->SetScalars(uscarray);
1396 vtkInformation *request,
1397 vtkInformationVector **inputVector,
1398 vtkInformationVector *outputVector)
1403 int uext[6], ext[6];
1405 vtkInformation *outInfo = outputVector->GetInformationObject(0);
1408 outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ext);
1410 outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uext);
1414 if ( uext[1] < ext[1] ) { uext[1] = ext[1]; }
1415 if ( uext[3] < ext[3] ) { uext[3] = ext[3]; }
1416 outInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uext, 6);
1423 vtkInformation *vtkNotUsed(request),
1424 vtkInformationVector **vtkNotUsed(inputVector),
1425 vtkInformationVector *outputVector)
1427 unsigned long startPos;
1428 unsigned int imageDirOffset;
1433 vtkInformation *outInfo = outputVector->GetInformationObject(0);
1439 vtkDebugMacro(<<
"Don't need to read header information");
1443 vtkDebugMacro(<<
"Executing information.");
1456 vtkErrorMacro(
"Given file is not a valid LSM-file.");
1470 vtkErrorMacro(
"Did not found LSM specific info!");
1476 "Sorry! Your LSM-file must be of type 6 LSM-file (time series x-y-z) or type 0 (normal x-y-z) or type 3 (2D + time). Type of this File is "
1481 vtkDebugMacro(<<
"Executing information: first directory has been read.");
1484 outInfo->Set(vtkDataObject::SPACING(), this->
DataSpacing, 3);
1486 outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),
1501 vtkDataObject::SetPointDataActiveScalarInfo(outInfo, this->
DataScalarType,
1505 vtkDebugMacro(<<
"Executing information: executed.");
1511 extent[0] = extent[2] = extent[4] = 0;
1529 return *( this->
ChannelColors->GetPointer( ( ch * 3 ) + component ) );
1536 return this->GetOutput();
1545 this->IntUpdateExtent[3] = timepoint;
1555 this->IntUpdateExtent[4] = ch;
1614 return *
static_cast< unsigned char *
>(
static_cast< void *
>( buf ) );
1619 return *
static_cast< int *
>(
static_cast< void *
>( buf ) );
1624 return *
static_cast< unsigned int *
>(
static_cast< void *
>( buf ) );
1629 return *
static_cast< short *
>(
static_cast< void *
>( buf ) );
1634 return *
static_cast< unsigned short *
>(
static_cast< void *
>( buf ) );
1639 return *
static_cast< double *
>(
static_cast< void *
>( buf ) );
1647 #ifdef VTK_WORDS_BIGENDIAN
1648 vtkByteSwap::Swap4LE( (
int *)buff );
1658 #ifdef VTK_WORDS_BIGENDIAN
1659 vtkByteSwap::Swap4LE( (
unsigned int *)buff );
1669 #ifdef VTK_WORDS_BIGENDIAN
1670 vtkByteSwap::Swap2LE( (
short *)buff );
1680 #ifdef VTK_WORDS_BIGENDIAN
1681 vtkByteSwap::Swap2LE( (
unsigned short *)buff );
1691 #ifdef VTK_WORDS_BIGENDIAN
1692 vtkByteSwap::Swap8LE( (
double *)buff );
1700 return this->
ReadFile(f, pos, size, buf, 1);
1706 std::streamsize ret = 1;
1708 f->seekg(pos, ios::beg);
1710 #ifdef VTK_WORDS_BIGENDIAN
1713 vtkByteSwap::SwapLERange(buf, size);
1720 if ( !f ) {
return 0; }
1733 this->Superclass::PrintSelf(os, indent);
1734 os << indent <<
"Identifier: " << this->
Identifier <<
"\n";
1737 os << indent <<
"Time points: " << this->Dimensions[3] <<
"\n";
1738 os <<
"Number of channels: " << this->Dimensions[4] <<
"\n";
1741 os << indent <<
"Number of intensity values Y: " << this->NumberOfIntensityValues[1] <<
"\n";
1742 os << indent <<
"Number of intensity values Z: " << this->NumberOfIntensityValues[2] <<
"\n";
1743 os << indent <<
"Number of intensity values Time: " << this->NumberOfIntensityValues[3] <<
"\n";
1744 os << indent <<
"Voxel size X: " << this->
VoxelSizes[0] <<
"\n";
1745 os << indent <<
"Voxel size Y: " << this->VoxelSizes[1] <<
"\n";
1746 os << indent <<
"Voxel size Z: " << this->VoxelSizes[2] <<
"\n";
1748 os << indent <<
"Scan type: " << this->
ScanType <<
"\n";
1749 os << indent <<
"Data type: " << this->
DataType <<
"\n";
1750 if ( this->DataType == 0 )
1754 os << indent << indent <<
"Data type of channel " << i <<
": " << this->
ChannelDataTypes->GetValue(i) <<
"\n";
1757 os << indent <<
"Compression: " << this->
Compression <<
"\n";
1761 os << indent <<
"Predictor: " << this->
Predictor <<
"\n";
1762 os << indent <<
"Channel info:\n";
1764 for (
int i = 0; i < this->Dimensions[4]; i++ )
1771 os << indent <<
"Strip byte counts:\n";
1773 for (
int i = 0; i < this->Dimensions[4]; i++ )
1775 os << indent << indent << this->
StripByteCount->GetValue(i) <<
"\n";
unsigned short Identifier
int ReadInt(ifstream *, unsigned long &)
int ReadChannelDataTypes(ifstream *, unsigned long)
int AllocateChannelNames(int)
void DecodeHorizontalDifferencingUnsignedShort(unsigned short *, int)
vtkUnsignedIntArray * StripOffset
#define VTK_FILE_BYTE_ORDER_BIG_ENDIAN
#define SUBBLOCK_DETECTION_CHANNELS
void NeedToReadHeaderInformationOff()
int FindChannelNameStart(const char *, int)
int CharPointerToInt(char *)
int NumberOfIntensityValues[4]
vtkUnsignedIntArray * ChannelDataTypes
vtkIntArray * ChannelColors
#define RECORDING_ENTRY_OBJETIVE
int ReadLSMSpecificInfo(ifstream *, unsigned long)
unsigned long ReadImageDirectory(ifstream *, unsigned long)
virtual void PrintSelf(ostream &os, vtkIndent indent)
const char * GetDataByteOrderAsString()
unsigned short PlanarConfiguration
#define SUBBLOCK_ILLUMINATION_CHANNEL
int TIFF_BYTES(unsigned short)
unsigned long SeekFile(unsigned long)
unsigned long GetSliceOffset(unsigned int timepoint, unsigned int slice)
std::streamsize ReadFile(ifstream *, unsigned long &, unsigned int, char *, bool swap=false)
int GetHeaderIdentifier()
#define DETCHANNEL_ENTRY_DETECTOR_GAIN_FIRST
#define TIF_PHOTOMETRICINTERPRETATION
int RequestUpdateExtent(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
void NeedToReadHeaderInformationOn()
#define DETCHANNEL_DETECTION_CHANNEL_NAME
#define RECORDING_ENTRY_DESCRIPTION
void SetUpdateTimePoint(int)
int NeedToReadHeaderInformation()
double ReadDouble(ifstream *, unsigned long &)
std::streamsize ReadData(ifstream *, unsigned long &, unsigned int, char *)
vtkUnsignedIntArray * StripByteCount
short CharPointerToShort(char *)
vtkDoubleArray * TimeStampInformation
unsigned short ReadUnsignedShort(ifstream *, unsigned long &)
int ReadChannelColorsAndNames(ifstream *, unsigned long)
#define SUBBLOCK_BEAM_SPLITTER
#define ILLUMCHANNEL_DETCHANNEL_NAME
unsigned long ChannelDataTypesOffset
#define DETCHANNEL_ENTRY_INTEGRATION_MODE
vtkStringArray * LaserNames
void SetDataByteOrderToBigEndian()
int GetNumberOfTimePoints()
char * GetChannelName(int)
int ReadChannelName(const char *, int, char *)
int GetNumberOfChannels()
unsigned long NumberOfLastAccessedImage
#define ILLUMCHANNEL_ENTRY_AQUIRE
int ReadScanInformation(ifstream *, unsigned long)
#define TIF_NEWSUBFILETYPE
#define TRACK_ENTRY_ACQUIRE
double CharPointerToDouble(char *)
unsigned short PhotometricInterpretation
unsigned short CharPointerToUnsignedShort(char *)
int AnalyzeTag(ifstream *, unsigned long)
vtkDoubleArray * TrackWavelengths
#define TIF_STRIPBYTECOUNTS
#define TIF_PLANARCONFIGURATION
vtkUnsignedLongArray * ImageOffsets
unsigned long ChannelInfoOffset
vtkImageData * GetTimePointOutput(int, int)
void DecodeHorizontalDifferencing(unsigned char *, int)
vtkUnsignedLongArray * ReadSizes
#define SUBBLOCK_DATA_CHANNELS
short ReadShort(ifstream *, unsigned long &)
void ConstructSliceOffsets()
#define TIF_SAMPLESPERPIXEL
unsigned long ColorMapOffset
int RequestData(vtkInformation *vtkNotUsed(request), vtkInformationVector **vtkNotUsed(inputVector), vtkInformationVector *outputVector)
int ReadTimeStampInformation(ifstream *, unsigned long)
#define DETCHANNEL_ENTRY_ACQUIRE
vtkStandardNewMacro(vtkLSMReader)
void SetDataByteOrder(int)
void SetUpdateChannel(int)
#define ILLUMCHANNEL_ENTRY_WAVELENGTH
int RequestInformation(vtkInformation *vtkNotUsed(request), vtkInformationVector **vtkNotUsed(inputVector), vtkInformationVector *outputVector)
#define SUBBLOCK_BEAM_SPLITTERS
unsigned int NewSubFileType
unsigned int GetUpdateChannel()
unsigned int ReadUnsignedInt(ifstream *, unsigned long &)
#define VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN
#define SUBBLOCK_DETECTION_CHANNEL
vtkUnsignedShortArray * BitsPerSample
#define DETCHANNEL_ENTRY_DETECTOR_GAIN_LAST
unsigned long GetOffsetToImage(int, int)
int GetDataTypeForChannel(unsigned int channel)
unsigned int CharPointerToUnsignedInt(char *)
#define SUBBLOCK_ILLUMINATION_CHANNELS
unsigned long GetStripByteCount(unsigned int timepoint, unsigned int slice)
void DecodeLZWCompression(unsigned char *, int)
unsigned int LSMSpecificInfoOffset
void SetDataByteOrderToLittleEndian()
#define TIF_BITSPERSAMPLE
unsigned char CharPointerToUnsignedChar(char *)
#define SUBBLOCK_DATA_CHANNEL
void SetFileName(const char *)
int SetChannelName(const char *, int)
int NumberOfScalarComponents
int BYTES_BY_DATA_TYPE(int)
unsigned int SamplesPerPixel
void CalculateExtentAndSpacing(int extent[6], double spacing[3])
int GetChannelColorComponent(int, int)
unsigned long OffsetToLastAccessedImage
#define SUBBLOCK_RECORDING