]> granicus.if.org Git - imagemagick/commitdiff
The DICOM reader now handles the rescale intercept and slope.
authordirk <dirk@git.imagemagick.org>
Tue, 24 Nov 2015 20:18:34 +0000 (21:18 +0100)
committerdirk <dirk@git.imagemagick.org>
Tue, 24 Nov 2015 20:18:34 +0000 (21:18 +0100)
coders/dcm.c

index 3be9b55bf4ee2681f2dcfffb24afe98825e94348..85202365b8b2a04216c26d3050486c80d2b777a8 100644 (file)
@@ -2826,6 +2826,8 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
 
   ssize_t
     count,
+    rescale_intercept,
+    rescale_slope,
     scene,
     window_center,
     y;
@@ -2894,6 +2896,8 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
   max_value=255UL;
   mask=0xffff;
   number_scenes=1;
+  rescale_intercept=0;
+  rescale_slope=1;
   samples_per_pixel=1;
   scale=(Quantum *) NULL;
   sequence=MagickFalse;
@@ -3301,6 +3305,24 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
               window_width=StringToUnsignedLong((char *) data);
             break;
           }
+          case 0x1052:
+          {
+            /*
+              Rescale intercept
+            */
+            if (data != (unsigned char *) NULL)
+              rescale_intercept=(ssize_t) StringToLong((char *) data);
+            break;
+          }
+          case 0x1053:
+          {
+            /*
+              Rescale slope
+            */
+            if (data != (unsigned char *) NULL)
+              rescale_slope=(ssize_t) StringToLong((char *) data);
+            break;
+          }
           case 0x1200:
           case 0x3006:
           {
@@ -3862,7 +3884,7 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       else
                         pixel_value=ReadDCMShort(stream_info,image);
                       if (polarity != MagickFalse)
-                        pixel_value=max_value-pixel_value;
+                        pixel_value=(int)max_value-pixel_value;
                     }
                   else
                     {
@@ -3877,11 +3899,11 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                         }
                       i++;
                     }
-                index=pixel_value;
+                index=(pixel_value*rescale_slope)+rescale_intercept;
                 if (window_width == 0)
                   {
                     if (signed_data == 1)
-                      index=pixel_value-32767;
+                      index-=32767;
                   }
                 else
                   {
@@ -3893,13 +3915,13 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       (window_width-1.0)/2.0-0.5);
                     window_max=(ssize_t) floor((double) window_center+
                       (window_width-1.0)/2.0+0.5);
-                    if ((ssize_t) pixel_value <= window_min)
+                    if ((ssize_t)index <= window_min)
                       index=0;
                     else
-                      if ((ssize_t) pixel_value > window_max)
+                      if ((ssize_t)index > window_max)
                         index=(int) max_value;
                       else
-                        index=(int) (max_value*(((pixel_value-window_center-
+                        index=(int) (max_value*(((index-window_center-
                           0.5)/(window_width-1))+0.5));
                   }
                 index&=mask;
@@ -3989,11 +4011,11 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                           }
                         i++;
                       }
-                  index=pixel_value;
+                  index=(pixel_value*rescale_slope)+rescale_intercept;
                   if (window_width == 0)
                     {
                       if (signed_data == 1)
-                        index=pixel_value-32767;
+                        index-=32767;
                     }
                   else
                     {
@@ -4005,13 +4027,13 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                         (window_width-1.0)/2.0-0.5);
                       window_max=(ssize_t) floor((double) window_center+
                         (window_width-1.0)/2.0+0.5);
-                      if ((ssize_t) pixel_value <= window_min)
+                      if ((ssize_t)index <= window_min)
                         index=0;
                       else
-                        if ((ssize_t) pixel_value > window_max)
+                        if ((ssize_t)index > window_max)
                           index=(int) max_value;
                         else
-                          index=(int) (max_value*(((pixel_value-window_center-
+                          index=(int) (max_value*(((index-window_center-
                             0.5)/(window_width-1))+0.5));
                     }
                   index&=mask;