Module: $RCSfile: gdcmFileHelper.cxx,v $
Language: C++
- Date: $Date: 2007/08/27 16:14:47 $
- Version: $Revision: 1.122 $
+ Date: $Date: 2007/09/04 13:14:33 $
+ Version: $Revision: 1.127 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
-
These lines will be moved to the document-to-be 'Developer's Guide'
WriteMode : WMODE_RAW / WMODE_RGB
// was :
//PixelWriteConverter->SetCompressJPEGUserData(
// inData, expectedSize, FileInternal);
- PixelWriteConverter->SetCompressJPEGUserData(
- PixelWriteConverter->GetUserData(),
- PixelWriteConverter->GetUserDataSize(),FileInternal);
+ PixelWriteConverter->SetCompressJPEGUserData(
+ PixelWriteConverter->GetUserData(),
+ PixelWriteConverter->GetUserDataSize(),FileInternal);
break;
case JPEG2000:
PixelWriteConverter->GetUserData(),
PixelWriteConverter->GetUserDataSize(),
FileInternal);
-
break;
}
int numberBitsAllocated = FileInternal->GetBitsAllocated();
if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 )
{
- gdcmWarningMacro( "numberBitsAllocated changed from "
- << numberBitsAllocated << " to 16 "
+ gdcmWarningMacro( "numberBitsAllocated changed from "
+ << numberBitsAllocated << " to 16 "
<< " for consistency purpose" );
numberBitsAllocated = 16;
}
size_t decSize = FileInternal->GetXSize()
- * FileInternal->GetYSize()
+ * FileInternal->GetYSize()
* FileInternal->GetZSize()
* FileInternal->GetTSize()
* FileInternal->GetSamplesPerPixel()
if ( FileInternal->HasLUT() )
rgbSize = decSize * 3;
+ size_t userDataSize = PixelWriteConverter->GetUserDataSize();
switch(WriteMode)
{
case WMODE_RAW :
- if ( decSize!=PixelWriteConverter->GetUserDataSize() )
+ if ( abs(decSize-userDataSize)>1) // ignore padding zero
{
gdcmWarningMacro( "Data size (Raw) is incorrect. Should be "
<< decSize << " / Found :"
- << PixelWriteConverter->GetUserDataSize() );
+ << userDataSize );
return false;
}
break;
case WMODE_RGB :
- if ( rgbSize!=PixelWriteConverter->GetUserDataSize() )
+ if ( abs(rgbSize-userDataSize)>1) // ignore padding zero
{
gdcmWarningMacro( "Data size (RGB) is incorrect. Should be "
- << decSize << " / Found "
- << PixelWriteConverter->GetUserDataSize() );
+ << rgbSize << " / Found "
+ << userDataSize );
return false;
}
break;
-4) user modified/added some tags *without processing* the pixels (anonymization...)
UNMODIFIED_PIXELS_IMAGE
-Probabely some more to be added.
+ --> Set it with FileHelper::SetContentType(int);
gdcm::FileHelper::CheckMandatoryElements() deals automatically with these cases.
if ( ContentType != USER_OWN_IMAGE) // when it's not a user made image
{
-
- gdcmDebugMacro( "USER_OWN_IMAGE (1)");
- // If 'SOP Class UID' exists ('true DICOM' image)
+ // If 'SOP Class UID' and 'SOP Instance UID' exist ('true DICOM' image)
// we create the 'Source Image Sequence' SeqEntry
// to hold informations about the Source Image
DataEntry *e_0008_0016 = FileInternal->GetDataEntry(0x0008, 0x0016);
- if ( e_0008_0016 )
+ DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
+ if ( e_0008_0016 && e_0008_0018)
{
// Create 'Source Image Sequence' SeqEntry
-// SeqEntry *sis = SeqEntry::New (
-// Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x2112) );
SeqEntry *sis = SeqEntry::New (0x0008, 0x2112);
SQItem *sqi = SQItem::New(1);
- // (we assume 'SOP Instance UID' exists too)
- // create 'Referenced SOP Class UID'
-// DataEntry *e_0008_1150 = DataEntry::New(
-// Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1150) );
+
+ // create 'Referenced SOP Class UID' from 'SOP Class UID'
+
DataEntry *e_0008_1150 = DataEntry::New(0x0008, 0x1150, "UI");
e_0008_1150->SetString( e_0008_0016->GetString());
sqi->AddEntry(e_0008_1150);
e_0008_1150->Delete();
- // create 'Referenced SOP Instance UID'
+ // create 'Referenced SOP Instance UID' from 'SOP Instance UID'
DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
-// DataEntry *e_0008_1155 = DataEntry::New(
-// Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1155) );
- DataEntry *e_0008_1155 = DataEntry::New(0x0008, 0x1155, "UI");
+
+ DataEntry *e_0008_1155 = DataEntry::New(0x0008, 0x1155, "UI");
e_0008_1155->SetString( e_0008_0018->GetString());
sqi->AddEntry(e_0008_1155);
e_0008_1155->Delete();
-
+
sis->AddSQItem(sqi,1);
sqi->Delete();
// temporarily replaces any previous 'Source Image Sequence'
Archive->Push(sis);
sis->Delete();
-
// FIXME : is 'Image Type' *really* depending on the presence of 'SOP Class UID'?
if ( ContentType == FILTERED_IMAGE)
// the user *knows* he just modified the pixels
}
}
- std::string pixelSpacing = FileInternal->GetEntryString(0x0028,0x0030);
- if ( pixelSpacing == GDCM_UNFOUND )
+ std::string pixelAspectRatio = FileInternal->GetEntryString(0x0028,0x0034);
+ if ( pixelAspectRatio == GDCM_UNFOUND ) // avoid conflict with pixelSpacing !
{
- pixelSpacing = "1.0\\1.0";
- // if missing, Pixel Spacing forced to "1.0\1.0"
- CopyMandatoryEntry(0x0028,0x0030,pixelSpacing,"DS");
- }
-
- // 'Imager Pixel Spacing' : defaulted to 'Pixel Spacing'
- // --> This one is the *legal* one !
- if ( ContentType != USER_OWN_IMAGE)
- // we write it only when we are *sure* the image comes from
- // an imager (see also 0008,0x0064)
- CheckMandatoryEntry(0x0018,0x1164,pixelSpacing,"DS");
-
+ std::string pixelSpacing = FileInternal->GetEntryString(0x0028,0x0030);
+ if ( pixelSpacing == GDCM_UNFOUND )
+ {
+ pixelSpacing = "1.0\\1.0";
+ // if missing, Pixel Spacing forced to "1.0\1.0"
+ CopyMandatoryEntry(0x0028,0x0030,pixelSpacing,"DS");
+ }
+
+ // 'Imager Pixel Spacing' : defaulted to 'Pixel Spacing'
+ // --> This one is the *legal* one !
+ if ( ContentType != USER_OWN_IMAGE)
+ // we write it only when we are *sure* the image comes from
+ // an imager (see also 0008,0x0064)
+ CheckMandatoryEntry(0x0018,0x1164,pixelSpacing,"DS");
+ }
/*
///Exact meaning of RETired fields
PixelReadConverter = new PixelReadConvert;
PixelWriteConverter = new PixelWriteConvert;
Archive = new DocEntryArchive( FileInternal );
+
+ KeepOverlays = false;
}
/**
}
}
*/
-
- ::itk::ExceptionObject e(__FILE__, __LINE__, message.str().c_str(),ITK_LOCATION);
- throw e;
- }
-}