+ }
+ }
+ //For ACR-NEMA
+ // 0020 0035 DS REL Image Orientation (RET)
+ else if ( (strImOriPat = GetEntryValue(0x0020,0x0035)) != GDCM_UNFOUND )
+ {
+ if ( sscanf( strImOriPat.c_str(), "%f \\ %f \\%f \\%f \\%f \\%f ",
+ &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
+ {
+ gdcmWarningMacro( "wrong Image Orientation Patient (0020,0035). Less than 6 values were found." );
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * \brief Retrieve the number of Bits Stored (actually used)
+ * (as opposed to number of Bits Allocated)
+ * @return The encountered number of Bits Stored, 0 by default.
+ * 0 means the file is NOT USABLE. The caller has to check it !
+ */
+int File::GetBitsStored()
+{
+ std::string strSize = GetEntryValue( 0x0028, 0x0101 );
+ if ( strSize == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro("(0028,0101) is supposed to be mandatory");
+ return 0; // It's supposed to be mandatory
+ // the caller will have to check
+ }
+ return atoi( strSize.c_str() );
+}
+
+/**
+ * \brief Retrieve the number of Bits Allocated
+ * (8, 12 -compacted ACR-NEMA files-, 16, 24 -old RGB ACR-NEMA files-,)
+ * @return The encountered Number of Bits Allocated, 0 by default.
+ * 0 means the file is NOT USABLE. The caller has to check it !
+ */
+int File::GetBitsAllocated()
+{
+ std::string strSize = GetEntryValue(0x0028,0x0100);
+ if ( strSize == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "(0028,0100) is supposed to be mandatory");
+ return 0; // It's supposed to be mandatory
+ // the caller will have to check
+ }
+ return atoi( strSize.c_str() );
+}
+
+/**
+ * \brief Retrieve the high bit position.
+ * \warning The method defaults to 0 when information is missing.
+ * The responsability of checking this value is left to the caller.
+ * @return The high bit position when present. 0 when missing.
+ */
+int File::GetHighBitPosition()
+{
+ std::string strSize = GetEntryValue( 0x0028, 0x0102 );
+ if ( strSize == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "(0028,0102) is supposed to be mandatory");
+ return 0;
+ }
+ return atoi( strSize.c_str() );
+}
+
+/**
+ * \brief Retrieve the number of Samples Per Pixel
+ * (1 : gray level, 3 : RGB/YBR -1 or 3 Planes-)
+ * @return The encountered number of Samples Per Pixel, 1 by default.
+ * (we assume Gray level Pixels)
+ */
+int File::GetSamplesPerPixel()
+{
+ const std::string &strSize = GetEntryValue(0x0028,0x0002);
+ if ( strSize == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "(0028,0002) is supposed to be mandatory");
+ return 1; // Well, it's supposed to be mandatory ...
+ // but sometimes it's missing : *we* assume Gray pixels
+ }
+ return atoi( strSize.c_str() );
+}
+
+/**
+ * \brief Retrieve the Planar Configuration for RGB images
+ * (0 : RGB Pixels , 1 : R Plane + G Plane + B Plane)
+ * @return The encountered Planar Configuration, 0 by default.
+ */
+int File::GetPlanarConfiguration()
+{
+ std::string strSize = GetEntryValue(0x0028,0x0006);
+ if ( strSize == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "Not found : Planar Configuration (0028,0006)");
+ return 0;
+ }
+ return atoi( strSize.c_str() );
+}
+
+/**
+ * \brief Return the size (in bytes) of a single pixel of data.
+ * @return The size in bytes of a single pixel of data; 0 by default
+ * 0 means the file is NOT USABLE; the caller will have to check
+ */
+int File::GetPixelSize()
+{
+ // 0028 0100 US IMG Bits Allocated
+ // (in order no to be messed up by old ACR-NEMA RGB images)
+ // if (File::GetEntryValue(0x0028,0x0100) == "24")
+ // return 3;
+
+ std::string pixelType = GetPixelType();
+ if ( pixelType == "8U" || pixelType == "8S" )
+ {
+ return 1;
+ }
+ if ( pixelType == "16U" || pixelType == "16S")
+ {
+ return 2;
+ }
+ if ( pixelType == "32U" || pixelType == "32S")
+ {
+ return 4;
+ }
+ if ( pixelType == "FD" )
+ {
+ return 8;
+ }
+ gdcmWarningMacro( "Unknown pixel type");
+ return 0;
+}
+
+/**
+ * \brief Build the Pixel Type of the image.
+ * Possible values are:
+ * - 8U unsigned 8 bit,
+ * - 8S signed 8 bit,
+ * - 16U unsigned 16 bit,
+ * - 16S signed 16 bit,
+ * - 32U unsigned 32 bit,
+ * - 32S signed 32 bit,
+ * - FD floating double 64 bits (Not kosher DICOM, but so usefull!)
+ * \warning 12 bit images appear as 16 bit.
+ * 24 bit images appear as 8 bit + photochromatic interp ="RGB "
+ * + Planar Configuration = 0
+ * @return 0S if nothing found. NOT USABLE file. The caller has to check
+ */
+std::string File::GetPixelType()
+{
+ std::string bitsAlloc = GetEntryValue(0x0028, 0x0100); // Bits Allocated
+ if ( bitsAlloc == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "Missing Bits Allocated (0028,0100)");
+ bitsAlloc = "16"; // default and arbitrary value, not to polute the output
+ }
+
+ if ( bitsAlloc == "64" )
+ {
+ return "FD";
+ }
+ else if ( bitsAlloc == "12" )
+ {
+ // It will be unpacked
+ bitsAlloc = "16";
+ }
+ else if ( bitsAlloc == "24" )
+ {
+ // (in order no to be messed up by old RGB images)
+ bitsAlloc = "8";
+ }
+
+ std::string sign = GetEntryValue(0x0028, 0x0103);//"Pixel Representation"
+
+ if (sign == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "Missing Pixel Representation (0028,0103)");
+ sign = "U"; // default and arbitrary value, not to polute the output
+ }
+ else if ( sign == "0" )
+ {
+ sign = "U";
+ }
+ else
+ {
+ sign = "S";
+ }
+ return bitsAlloc + sign;
+}
+
+/**
+ * \brief Check whether the pixels are signed (1) or UNsigned (0) data.
+ * \warning The method defaults to false (UNsigned) when tag 0028|0103
+ * is missing.
+ * The responsability of checking this value is left to the caller
+ * (NO transformation is performed on the pixels to make then >0)
+ * @return True when signed, false when UNsigned
+ */
+bool File::IsSignedPixelData()
+{
+ std::string strSign = GetEntryValue( 0x0028, 0x0103 );
+ if ( strSign == GDCM_UNFOUND )
+ {
+ gdcmWarningMacro( "(0028,0103) is supposed to be mandatory");
+ return false;
+ }
+ int sign = atoi( strSign.c_str() );
+ if ( sign == 0 )
+ {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * \brief Check whether this a monochrome picture (gray levels) or not,
+ * using "Photometric Interpretation" tag (0x0028,0x0004).
+ * @return true when "MONOCHROME1" or "MONOCHROME2". False otherwise.
+ */
+bool File::IsMonochrome()
+{
+ const std::string &PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
+ if ( Util::DicomStringEqual(PhotometricInterp, "MONOCHROME1")
+ || Util::DicomStringEqual(PhotometricInterp, "MONOCHROME2") )
+ {