Program: gdcm
Module: $RCSfile: gdcmFileHelper.h,v $
Language: C++
- Date: $Date: 2007/08/24 10:45:18 $
- Version: $Revision: 1.53 $
+ Date: $Date: 2007/09/04 13:14:33 $
+ Version: $Revision: 1.54 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
/// Accessor to \ref File
File *GetFile() { return FileInternal; }
-
+ /// \brief Tells gdcm wether we want to keep ACR-NEMA-like overlays or not.
+ void SetKeepOverlays(bool k) { KeepOverlays =k; }
+ bool GetKeepOverlays( ) { return KeepOverlays; }
+
void SetLoadMode(int loadMode);
void SetFileName(std::string const &fileName);
bool Load();
/// \brief 1 : white=0, black=high value
/// 2 : black=0, white=high value (default)
int PhotometricInterpretation;
+
+ /// \brief wether we want to keep ACR-NEMA-like overlays or not.
+ bool KeepOverlays;
};
} // end namespace gdcm
Program: gdcm
Module: $RCSfile: gdcmPixelReadConvert.cxx,v $
Language: C++
- Date: $Date: 2007/09/03 16:34:58 $
- Version: $Revision: 1.118 $
+ Date: $Date: 2007/09/04 13:14:33 $
+ Version: $Revision: 1.119 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
int length = XSize * YSize * ZSize * SamplesPerPixel;
int numberBytes = BitsAllocated / 8;
+ // to avoid major troubles when BitsStored == 8 && BitsAllocated==16 !
int dummy;
if (BitsStored == 8 && BitsAllocated==16)
dummy = 16;
&& !PixelSign )
{
int l = (int)( RawSize / ( BitsAllocated / 8 ) );
- uint16_t *deb = (uint16_t *)Raw;
int l = (int)( RawSize / ( BitsAllocated / 8 ) );
uint16_t *deb = (uint16_t *)Raw;
for(int i = 0; i<l; i++)
}
else if ( BitsAllocated == 32 )
{
+ }
+ deb++;
+ }
+ }
+ }
+ else if ( BitsAllocated == 32 )
+ {
+ // pmask : to mask the 'unused bits' (may contain overlays)
+ uint32_t pmask = 0xffffffff;
+ pmask = pmask >> ( BitsAllocated - BitsStored );
+
uint32_t *deb = (uint32_t*)Raw;
if ( !PixelSign )
*deb = *deb >> (BitsStored - HighBitPosition - 1);
if ( *deb & smask )
*deb = *deb | nmask;
- else
- *deb = *deb & pmask;
+ else
+ *deb = *deb & pmask;
deb++;
}
}
Since almost every vendor that I have encountered that encodes LUTs
makes this mistake, perhaps it is time to amend the standard to warn
-implementor's of receivers and/or sanction this bad behavior. We have
-talked about this in the past in WG 6 but so far everyone has been
-reluctant to write into the standard such a comment. Maybe it is time
-to try again, since if one is not aware of this problem, one cannot
-effectively implement display using VOI LUTs, and there is a vast
-installed base to contend with.
-
-I did not check presentation states, in which VOI LUTs could also be
-encountered, for the prevalence of this mistake, nor did I look at the
-encoding of Modality LUT's, which are unusual. Nor did I check digital
-mammography images. I would be interested to hear from anyone who has.
I did not check presentation states, in which VOI LUTs could also be
encountered, for the prevalence of this mistake, nor did I look at the
encoding of Modality LUT's, which are unusual. Nor did I check digital
Program: gdcm
Module: $RCSfile: gdcmPixelWriteConvert.cxx,v $
Language: C++
- Date: $Date: 2007/08/31 10:59:08 $
- Version: $Revision: 1.22 $
+ Date: $Date: 2007/09/04 13:14:33 $
+ Version: $Revision: 1.23 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
int xsize = image->GetXSize();
int ysize = image->GetYSize();
int zsize = image->GetZSize();
+
int samplesPerPixel = image->GetSamplesPerPixel();
+ int bitsAllocated = image->GetBitsAllocated();
+ int bitsStored = image->GetBitsStored();
+
//std::cout << "X: " << xsize << std::endl;
//std::cout << "Y: " << ysize << std::endl;
//std::cout << "Sample: " << samplesPerPixel << std::endl;
- gdcmDebugMacro( "image->GetBitsAllocated() " << image->GetBitsAllocated() << " image->GetBitsStored() " <<image->GetBitsStored() <<
+ gdcmDebugMacro( "bitsAllocated " << bitsAllocated << " bitsStored " <<bitsStored <<
std::endl);
- int bitsstored = image->GetBitsStored();
- unsigned int fragment_size = xsize*ysize*samplesPerPixel * (image->GetBitsAllocated() / 8);
+
+ unsigned int fragment_size = xsize*ysize*samplesPerPixel * (bitsAllocated / 8);
gdcmDebugMacro("fragment_size " << fragment_size << " zsize " << zsize << " size " << size);
assert( abs(fragment_size*zsize-size) <=1 );
#else
EncodeWithoutBasicOffsetTable(of, 1);
#endif
+
+ // to avoid major troubles when BitsStored == 8 && BitsAllocated==16 !
+
+ if (bitsStored == 8 && bitsAllocated == 16)
+ bitsStored = 16;
+
uint8_t *pImageData = data;
for(int i=0; i<zsize;i++)
{
gdcmDebugMacro("Write fragment no " << i );
WriteDICOMItems(of, JpegFragmentSize);
size_t beg = of->tellp();
- if( bitsstored == 8 )
+ if( bitsStored == 8 )
{
gdcm_write_JPEG_file8(of, (char*)pImageData,size,
- image->GetXSize(), image->GetYSize(), image->GetZSize(), image->GetSamplesPerPixel(),
- image->GetBitsAllocated(), 100 );
+ xsize, ysize, zsize, samplesPerPixel,
+ bitsAllocated, 100 );
}
- else if (bitsstored <= 12)
+ else if (bitsStored <= 12)
{
- assert( bitsstored >= 8 );
- gdcm_write_JPEG_file12(of, (char*)pImageData,size,
- image->GetXSize(), image->GetYSize(), image->GetZSize(), image->GetSamplesPerPixel(),
- image->GetBitsAllocated(), 100);
+ assert( bitsStored >= 8 );
+ gdcm_write_JPEG_file12(of, (char*)pImageData, size,
+ xsize, ysize, zsize, samplesPerPixel,
+ bitsAllocated, 100);
}
- else if (bitsstored <= 16)
+ else if (bitsStored <= 16)
{
- assert( bitsstored >= 12 );
+ assert( bitsStored >= 12 );
gdcm_write_JPEG_file16(of, (char*)pImageData,size,
- image->GetXSize(), image->GetYSize(), image->GetZSize(), image->GetSamplesPerPixel(),
- image->GetBitsAllocated(), 100);
+ xsize, ysize, zsize, samplesPerPixel,
+ bitsAllocated, 100);
}
- else if (bitsstored <= 32) // if we are lucky (?), it will compress as a 2 bytes stream
+ else if (bitsStored <= 32) // if we are lucky (?), it will compress as a 2 bytes stream
{ // (Actually it doesn't !)
// Just to allow ctest not to abort on 32bits per pixel image RTDOSE.dcm
- assert( bitsstored >= 16 );
- gdcmDebugMacro( "Warning : bitsstored>16 not supported by JPEG !" );
+ assert( bitsStored >= 16 );
+ gdcmDebugMacro( "Warning : bitsStored>16 not supported by JPEG !" );
gdcm_write_JPEG_file16(of, (char*)pImageData, size,
- image->GetXSize(), image->GetYSize(), image->GetZSize(), image->GetSamplesPerPixel(),
- image->GetBitsAllocated(), 100);
+ xsize, ysize, zsize, samplesPerPixel,
+ bitsAllocated, 100);
}
else
{
- std::cerr << "Major pb : bitsstored =" << bitsstored << std::endl;
+ std::cerr << "Major pb : bitsStored =" << bitsStored << std::endl;
abort();
}
size_t end = of->tellp();