📄 gdcmfilehelper.cxx
字号:
* - Copies the pixel data (image[s]/volume[s]) to newly allocated zone.
* @return Pointer to newly allocated pixel data.
* (uint8_t is just for prototyping. feel free to cast)
* NULL if alloc fails
*/
uint8_t *FileHelper::GetImageData()
{
if ( PixelWriteConverter->GetUserData() )
{
return PixelWriteConverter->GetUserData();
}
if ( ! GetRaw() )
{
// If the decompression failed nothing can be done.
return 0;
}
if ( FileInternal->HasLUT() && PixelReadConverter->BuildRGBImage() )
{
return PixelReadConverter->GetRGB();
}
else
{
// When no LUT or LUT conversion fails, return the Raw
return PixelReadConverter->GetRaw();
}
}
/**
* \brief brings pixels into memory :
* - Allocates necessary memory,
* - Transforms YBR pixels (if any) into RGB pixels
* - Transforms 3 planes R, G, B (if any) into a single RGB Plane
* - Copies the pixel data (image[s]/volume[s]) to newly allocated zone.
* - DOES NOT transform Grey plane + 3 Palettes into a RGB Plane
* @return Pointer to newly allocated pixel data.
* (uint8_t is just for prototyping. feel free to cast)
* NULL if alloc fails
*/
uint8_t *FileHelper::GetImageDataRaw ()
{
return GetRaw();
}
#ifndef GDCM_LEGACY_REMOVE
/*
* \brief Useless function, since PixelReadConverter forces us
* copy the Pixels anyway.
* Reads the pixels from disk (uncompress if necessary),
* Transforms YBR pixels, if any, into RGB pixels
* Transforms 3 planes R, G, B, if any, into a single RGB Plane
* Transforms single Grey plane + 3 Palettes into a RGB Plane
* Copies at most MaxSize bytes of pixel data to caller allocated
* memory space.
* \warning This function allows people that want to build a volume
* from an image stack *not to* have, first to get the image pixels,
* and then move them to the volume area.
* It's absolutely useless for any VTK user since vtk chooses
* to invert the lines of an image, that is the last line comes first
* (for some axis related reasons?). Hence he will have
* to load the image line by line, starting from the end.
* VTK users have to call GetImageData
*
* @param destination Address (in caller's memory space) at which the
* pixel data should be copied
* @param maxSize Maximum number of bytes to be copied. When MaxSize
* is not sufficient to hold the pixel data the copy is not
* executed (i.e. no partial copy).
* @return On success, the number of bytes actually copied. Zero on
* failure e.g. MaxSize is lower than necessary.
*/
size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize)
{
if ( ! GetRaw() )
{
// If the decompression failed nothing can be done.
return 0;
}
if ( FileInternal->HasLUT() && PixelReadConverter->BuildRGBImage() )
{
if ( PixelReadConverter->GetRGBSize() > maxSize )
{
gdcmWarningMacro( "Pixel data bigger than caller's expected MaxSize");
return 0;
}
memcpy( destination,
(void*)PixelReadConverter->GetRGB(),
PixelReadConverter->GetRGBSize() );
return PixelReadConverter->GetRGBSize();
}
// Either no LUT conversion necessary or LUT conversion failed
if ( PixelReadConverter->GetRawSize() > maxSize )
{
gdcmWarningMacro( "Pixel data bigger than caller's expected MaxSize");
return 0;
}
memcpy( destination,
(void *)PixelReadConverter->GetRaw(),
PixelReadConverter->GetRawSize() );
return PixelReadConverter->GetRawSize();
}
#endif
/**
* \brief Points the internal pointer to the callers inData
* image representation, BUT WITHOUT COPYING THE DATA.
* 'image' Pixels are presented as C-like 2D arrays : line per line.
* 'volume'Pixels are presented as C-like 3D arrays : plane per plane
* \warning Since the pixels are not copied, it is the caller's responsability
* not to deallocate its data before gdcm uses them (e.g. with
* the Write() method )
* @param inData user supplied pixel area (uint8_t* is just for the compiler.
* user is allowed to pass any kind of pixelsn since the size is
* given in bytes)
* @param expectedSize total image size, *in Bytes*
*/
void FileHelper::SetImageData(uint8_t *inData, size_t expectedSize)
{
//assert( WriteType != Unknown );
SetUserData(inData, expectedSize);
}
/**
* \brief Set the image data defined by the user
* \warning When writting the file, this data are get as default data to write
* @param inData user supplied pixel area (uint8_t* is just for the compiler.
* user is allowed to pass any kind of pixels since the size is
* given in bytes)
* @param expectedSize total image size, *in Bytes*
*/
void FileHelper::SetUserData(uint8_t *inData, size_t expectedSize)
{
if( WriteType == JPEG2000 )
{
PixelWriteConverter->SetCompressJPEG2000UserData(inData, expectedSize, FileInternal);
}
else if( WriteType == JPEG )
{
PixelWriteConverter->SetCompressJPEGUserData(inData, expectedSize, FileInternal);
}
else
{
PixelWriteConverter->SetUserData(inData, expectedSize);
}
}
/**
* \brief Get the image data defined by the user
* \warning When writting the file, this data are get as default data to write
*/
uint8_t *FileHelper::GetUserData()
{
return PixelWriteConverter->GetUserData();
}
/**
* \brief Get the image data size defined by the user
* \warning When writting the file, this data are get as default data to write
*/
size_t FileHelper::GetUserDataSize()
{
return PixelWriteConverter->GetUserDataSize();
}
/**
* \brief Get the image data from the file.
* If a LUT is found, the data are expanded to be RGB
*/
uint8_t *FileHelper::GetRGBData()
{
return PixelReadConverter->GetRGB();
}
/**
* \brief Get the image data size from the file.
* If a LUT is found, the data are expanded to be RGB
*/
size_t FileHelper::GetRGBDataSize()
{
return PixelReadConverter->GetRGBSize();
}
/**
* \brief Get the image data from the file.
* Even when a LUT is found, the data are not expanded to RGB!
*/
uint8_t *FileHelper::GetRawData()
{
return PixelReadConverter->GetRaw();
}
/**
* \brief Get the image data size from the file.
* Even when a LUT is found, the data are not expanded to RGB!
*/
size_t FileHelper::GetRawDataSize()
{
return PixelReadConverter->GetRawSize();
}
/**
* \brief Access to the underlying \ref PixelReadConverter RGBA LUT
*/
uint8_t* FileHelper::GetLutRGBA()
{
if ( PixelReadConverter->GetLutRGBA() ==0 )
PixelReadConverter->BuildLUTRGBA();
return PixelReadConverter->GetLutRGBA();
}
/**
* \brief Access to the underlying \ref PixelReadConverter RGBA LUT Item Number
*/
int FileHelper::GetLutItemNumber()
{
return PixelReadConverter->GetLutItemNumber();
}
/**
* \brief Access to the underlying \ref PixelReadConverter RGBA LUT Item Size
*/
int FileHelper::GetLutItemSize()
{
return PixelReadConverter->GetLutItemSize();
}
/**
* \brief Writes on disk A SINGLE Dicom file
* NO test is performed on processor "Endiannity".
* It's up to the user to call his Reader properly
* @param fileName name of the file to be created
* (any already existing file is over written)
* @return false if write fails
*/
bool FileHelper::WriteRawData(std::string const &fileName)
{
std::ofstream fp1(fileName.c_str(), std::ios::out | std::ios::binary );
if (!fp1)
{
gdcmWarningMacro( "Fail to open (write) file:" << fileName.c_str());
return false;
}
if ( PixelWriteConverter->GetUserData() )
{
fp1.write( (char *)PixelWriteConverter->GetUserData(),
PixelWriteConverter->GetUserDataSize() );
}
else if ( PixelReadConverter->GetRGB() )
{
fp1.write( (char *)PixelReadConverter->GetRGB(),
PixelReadConverter->GetRGBSize());
}
else if ( PixelReadConverter->GetRaw() )
{
fp1.write( (char *)PixelReadConverter->GetRaw(),
PixelReadConverter->GetRawSize());
}
else
{
gdcmErrorMacro( "Nothing written." );
}
fp1.close();
return true;
}
/**
* \brief Writes on disk A SINGLE Dicom file,
* using the Implicit Value Representation convention
* NO test is performed on processor "Endianity".
* @param fileName name of the file to be created
* (any already existing file is overwritten)
* @return false if write fails
*/
bool FileHelper::WriteDcmImplVR (std::string const &fileName)
{
SetWriteTypeToDcmImplVR();
return Write(fileName);
}
/**
* \brief Writes on disk A SINGLE Dicom file,
* using the Explicit Value Representation convention
* NO test is performed on processor "Endiannity".
* @param fileName name of the file to be created
* (any already existing file is overwritten)
* @return false if write fails
*/
bool FileHelper::WriteDcmExplVR (std::string const &fileName)
{
SetWriteTypeToDcmExplVR();
return Write(fileName);
}
/**
* \brief Writes on disk A SINGLE Dicom file,
* using the ACR-NEMA convention
* NO test is performed on processor "Endiannity".
* (a l'attention des logiciels cliniques
* qui ne prennent en entr閑 QUE des images ACR ...
* \warning if a DICOM_V3 header is supplied,
* groups < 0x0008 and shadow groups are ignored
* \warning NO TEST is performed on processor "Endiannity".
* @param fileName name of the file to be created
* (any already existing file is overwritten)
* @return false if write fails
*/
bool FileHelper::WriteAcr (std::string const &fileName)
{
SetWriteTypeToAcr();
return Write(fileName);
}
/**
* \brief Writes on disk A SINGLE Dicom file,
* @param fileName name of the file to be created
* (any already existing file is overwritten)
* @return false if write fails
*/
bool FileHelper::Write(std::string const &fileName)
{
switch(WriteType)
{
case ImplicitVR:
SetWriteFileTypeToImplicitVR();
break;
case Unknown: // should never happen; ExplicitVR is the default value
case ExplicitVR:
SetWriteFileTypeToExplicitVR();
break;
case ACR:
case ACR_LIBIDO:
// NOTHING is done here just for LibIDO.
// Just to avoid further trouble if user creates a file ex-nihilo,
// wants to write it as an ACR-NEMA file,
// and forgets to create any Entry belonging to group 0008
// (shame on him !)
// We add Recognition Code (RET)
if ( ! FileInternal->GetValEntry(0x0008, 0x0010) )
FileInternal->InsertValEntry("", 0x0008, 0x0010);
SetWriteFileTypeToACR();
// SetWriteFileTypeToImplicitVR(); // ACR IS implicit VR !
break;
case JPEG:
SetWriteFileTypeToJPEG();
break;
case JPEG2000:
SetWriteFileTypeToJPEG2000();
break;
}
CheckMandatoryElements();
// --------------------------------------------------------------
// Special Patch to allow gdcm to re-write ACR-LibIDO formated images
//
// if recognition code tells us we dealt with a LibIDO image
// we reproduce on disk the switch between lineNumber and columnNumber
// just before writting ...
/// \todo the best trick would be *change* the recognition code
/// but pb expected if user deals with, e.g. COMPLEX images
if ( WriteType == ACR_LIBIDO )
{
SetWriteToLibido();
}
else
{
SetWriteToNoLibido();
}
// ----------------- End of Special Patch ----------------
switch(WriteMode)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -