[magick-developers] Unsigned 16 bit DICOM

Shane Blackett s.blackett at auckland.ac.nz
Thu Oct 18 13:27:43 PDT 2007


Sorry.  Here is the patch.

If there was some agreement that it would be good (from others 
interested in DICOM reading) I could extend the respect of the flag to 
8bit and 12bit images too, although it would help to have some concrete 
examples of such files to test against.

--- ImageMagick-svn/coders/dcm.c	2007-10-18 14:29:06.000000000 +1300
+++ ImageMagick-16bitDICOM/coders/dcm.c	2007-10-18 12:00:35.000000000 +1300
@@ -2745,6 +2745,7 @@
      number_scenes,
      quantum,
      samples_per_pixel,
+	 signed_data,
      significant_bits,
      status,
      width;
@@ -2797,6 +2798,7 @@
    mask=0xffff;
    number_scenes=1;
    samples_per_pixel=1;
+  signed_data=0xffff; /* Set a value to represent unspecified */
    significant_bits=0;
    *transfer_syntax='\0';
    use_explicit=MagickFalse;
@@ -3059,6 +3061,7 @@
              /*
                Pixel representation.
              */
+				signed_data = (unsigned long) datum;
              break;
            }
            case 0x1200:
@@ -3188,6 +3191,19 @@
        InheritException(exception,&image->exception);
        return(DestroyImageList(image));
      }
+  if (signed_data==0xffff)
+  {
+	  /* Use the previous assumptions,
+		  8 bit and 12 bit are unsigned and 16 bit is signed */
+	  if (significant_bits == 16)
+	  {
+		  signed_data = 1;
+	  }
+	  else
+	  {
+		  signed_data = 0;
+	  }
+  }
    if ((strcmp(transfer_syntax,"1.2.840.10008.1.2.4.50") == 0) ||
        (strcmp(transfer_syntax,"1.2.840.10008.1.2.4.70") == 0))
      {
@@ -3374,9 +3390,15 @@
                    if ((bits_allocated != 12) || (significant_bits != 12))
                      {
                        if (msb_first != MagickFalse)
-                        index=(unsigned long) 
ReadBlobMSBShort(image)-32767;
+								if (signed_data == 1)
+                          index=(unsigned long) 
ReadBlobMSBShort(image)-32767;
+							   else
+                          index=(unsigned long) ReadBlobMSBShort(image);
                        else
-                        index=(unsigned long) 
ReadBlobLSBShort(image)-32767;
+								if (signed_data == 1)
+                          index=(unsigned long) 
ReadBlobLSBShort(image)-32767;
+							   else
+                          index=(unsigned long) ReadBlobLSBShort(image);
                      }
                    else
                      {


More information about the Magick-developers mailing list