Re: Unsigned 16 bit DICOM

Shane Blackett <[email protected]>
Newsgroups gmane.comp.video.image-magick.devel
Message-ID <[email protected]>
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
                      {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.