Commit 26ca4ee01 for imagemagick.org

commit 26ca4ee01ecb561afbbca950d102d090fb5408ca
Author: Dirk Lemstra <dirk@lemstra.org>
Date:   Sat Mar 28 09:27:35 2026 +0100

    Added option that can be used to fix the byte order of a DICOM image.

diff --git a/coders/dcm.c b/coders/dcm.c
index 9c01c5241..c0455a27a 100644
--- a/coders/dcm.c
+++ b/coders/dcm.c
@@ -2839,7 +2839,7 @@ static signed short ReadDCMSignedShort(DCMStreamInfo *stream_info,Image *image)

 static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
   DCMStreamInfo *stream_info,MagickBooleanType first_segment,
-  ExceptionInfo *exception)
+  EndianType endian,ExceptionInfo *exception)
 {
   int
     byte,
@@ -2947,9 +2947,12 @@ static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
           index=(int) ConstrainColormapIndex(image,(ssize_t) index,exception);
           if (first_segment != MagickFalse)
             SetPixelIndex(image,(Quantum) index,q);
-          else
+          else if (endian == LSBEndian)
             SetPixelIndex(image,(Quantum) (((size_t) index) |
               (((size_t) GetPixelIndex(image,q)) << 8)),q);
+          else
+            SetPixelIndex(image,(Quantum) ((((size_t) index) << 8) |
+              (size_t) GetPixelIndex(image,q)),q);
           pixel.red=(unsigned int) image->colormap[index].red;
           pixel.green=(unsigned int) image->colormap[index].green;
           pixel.blue=(unsigned int) image->colormap[index].blue;
@@ -2987,7 +2990,7 @@ static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
           SetPixelGreen(image,(Quantum) pixel.green,q);
           SetPixelBlue(image,(Quantum) pixel.blue,q);
         }
-      else
+      else if (endian == LSBEndian)
         {
           SetPixelRed(image,(Quantum) (((size_t) pixel.red) |
             (((size_t) GetPixelRed(image,q)) << 8)),q);
@@ -2996,6 +2999,15 @@ static MagickBooleanType ReadDCMPixels(Image *image,DCMInfo *info,
           SetPixelBlue(image,(Quantum) (((size_t) pixel.blue) |
             (((size_t) GetPixelBlue(image,q)) << 8)),q);
         }
+      else
+        {
+          SetPixelRed(image,(Quantum) ((((size_t) pixel.red) << 8) |
+            (size_t) GetPixelRed(image,q)),q);
+          SetPixelGreen(image,(Quantum) ((((size_t) pixel.green) << 8) |
+            (size_t) GetPixelGreen(image,q)),q);
+          SetPixelBlue(image,(Quantum) ((((size_t) pixel.blue) << 8) |
+            (size_t) GetPixelBlue(image,q)),q);
+        }
       q+=(ptrdiff_t) GetPixelChannels(image);
     }
     if (SyncAuthenticPixels(image,exception) == MagickFalse)
@@ -4261,6 +4273,9 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           const char
             *option;

+          EndianType
+            endian;
+
           /*
             Convert DCM Medical image to pixel packets.
           */
@@ -4287,18 +4302,22 @@ static Image *ReadDCMImage(const ImageInfo *image_info,ExceptionInfo *exception)
               info.rescale=MagickTrue;
             }
           option=GetImageOption(image_info,"dcm:rescale");
-          if (option != (char *) NULL)
-            info.rescale=IsStringTrue(option);
+          info.rescale=IsStringTrue(option);
           if ((info.window_center != 0) && (info.window_width == 0))
             info.window_width=info.window_center;
-          status=ReadDCMPixels(image,&info,stream_info,MagickTrue,exception);
+          endian=LSBEndian;
+          option=GetImageOption(image_info,"dcm:fix-byte-order");
+          if (IsStringTrue(option) != MagickFalse)
+            endian=MSBEndian;
+          status=ReadDCMPixels(image,&info,stream_info,MagickTrue,endian,
+            exception);
           if ((status != MagickFalse) && (stream_info->segment_count > 1))
             {
               if (stream_info->offset_count > 0)
                 (void) SeekBlob(image,(MagickOffsetType)
                   stream_info->offsets[0]+stream_info->segments[1],SEEK_SET);
               (void) ReadDCMPixels(image,&info,stream_info,MagickFalse,
-                exception);
+                endian,exception);
             }
         }
       if (IdentifyImageCoderGray(image,exception) != MagickFalse)