]> granicus.if.org Git - imagemagick/blobdiff - magick/quantum-export.c
(no commit message)
[imagemagick] / magick / quantum-export.c
index 8eade97a4b2e7f4d572831be19774e6b82078c6c..a3785592b06f81feeca146beae0071cce4b12883 100644 (file)
 %
 %  The format of the ExportQuantumPixels method is:
 %
-%      size_t ExportQuantumPixels(const Image *image,const CacheView *image_view,
-%        const QuantumInfo *quantum_info,const QuantumType quantum_type,
-%        unsigned char *pixels,ExceptionInfo *exception)
+%      size_t ExportQuantumPixels(const Image *image,
+%        const CacheView *image_view,const QuantumInfo *quantum_info,
+%        const QuantumType quantum_type,unsigned char *pixels,
+%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -172,23 +173,23 @@ static inline unsigned char *PopFloatPixel(const QuantumState *quantum_state,
 }
 
 static inline unsigned char *PopQuantumPixel(QuantumState *quantum_state,
-  const unsigned long depth,const QuantumAny pixel,unsigned char *pixels)
+  const size_t depth,const QuantumAny pixel,unsigned char *pixels)
 {
-  register long
+  register ssize_t
     i;
 
-  register unsigned long
+  size_t
     quantum_bits;
 
   if (quantum_state->bits == 0UL)
-    quantum_state->bits=8UL;
-  for (i=(long) depth; i > 0L; )
+    quantum_state->bits=8U;
+  for (i=(ssize_t) depth; i > 0L; )
   {
-    quantum_bits=(unsigned long) i;
+    quantum_bits=(size_t) i;
     if (quantum_bits > quantum_state->bits)
       quantum_bits=quantum_state->bits;
-    i-=quantum_bits;
-    if (quantum_state->bits == 8)
+    i-=(ssize_t) quantum_bits;
+    if (quantum_state->bits == 8UL)
       *pixels='\0';
     quantum_state->bits-=quantum_bits;
     *pixels|=(((pixel >> i) &~ ((~0UL) << quantum_bits)) <<
@@ -203,30 +204,30 @@ static inline unsigned char *PopQuantumPixel(QuantumState *quantum_state,
 }
 
 static inline unsigned char *PopQuantumLongPixel(QuantumState *quantum_state,
-  const unsigned long depth,const unsigned long pixel,unsigned char *pixels)
+  const size_t depth,const size_t pixel,unsigned char *pixels)
 {
-  register long
+  register ssize_t
     i;
 
-  unsigned long
+  size_t
     quantum_bits;
 
-  if (quantum_state->bits == 0UL)
+  if (quantum_state->bits == 0U)
     quantum_state->bits=32UL;
-  for (i=(long) depth; i > 0; )
+  for (i=(ssize_t) depth; i > 0; )
   {
-    quantum_bits=(unsigned long) i;
+    quantum_bits=(size_t) i;
     if (quantum_bits > quantum_state->bits)
       quantum_bits=quantum_state->bits;
     quantum_state->pixel|=(((pixel >> (depth-i)) &
-      quantum_state->mask[quantum_bits]) << (32UL-quantum_state->bits));
-    i-=quantum_bits;
+      quantum_state->mask[quantum_bits]) << (32U-quantum_state->bits));
+    i-=(ssize_t) quantum_bits;
     quantum_state->bits-=quantum_bits;
     if (quantum_state->bits == 0U)
       {
         pixels=PopLongPixel(quantum_state->endian,quantum_state->pixel,pixels);
         quantum_state->pixel=0U;
-        quantum_state->bits=32UL;
+        quantum_state->bits=32U;
       }
   }
   return(pixels);
@@ -239,9 +240,6 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
   EndianType
     endian;
 
-  long
-    bit;
-
   MagickRealType
     alpha;
 
@@ -255,20 +253,23 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
     quantum_state;
 
   register const IndexPacket
-    *indexes;
+    *restrict indexes;
 
   register const PixelPacket
-    *p;
+    *restrict p;
 
-  register long
+  register ssize_t
     x;
 
   register unsigned char
-    *q;
+    *restrict q;
 
   size_t
     extent;
 
+  ssize_t
+    bit;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -277,10 +278,13 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
   assert(quantum_info->signature == MagickSignature);
   if (pixels == (unsigned char *) NULL)
     pixels=GetQuantumPixels(quantum_info);
-  number_pixels=GetImageExtent(image);
-  p=GetVirtualPixelQueue(image);
-  indexes=GetVirtualIndexQueue(image);
-  if (image_view != (CacheView *) NULL)
+  if (image_view == (CacheView *) NULL)
+    {
+      number_pixels=GetImageExtent(image);
+      p=GetVirtualPixelQueue(image);
+      indexes=GetVirtualIndexQueue(image);
+    }
+  else
     {
       number_pixels=GetCacheViewExtent(image_view);
       p=GetCacheViewVirtualPixelQueue(image_view);
@@ -297,16 +301,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       q=GetAuthenticPixelQueue(image);
       if (image_view != (CacheView *) NULL)
         q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
-      for (x=0; x < (long) image->columns; x++)
+      for (x=0; x < (ssize_t) image->columns; x++)
       {
         alpha=QuantumScale*((double) QuantumRange-q->opacity);
-        q->red=RoundToQuantum(alpha*q->red);
-        q->green=RoundToQuantum(alpha*q->green);
-        q->blue=RoundToQuantum(alpha*q->blue);
+        q->red=ClampToQuantum(alpha*q->red);
+        q->green=ClampToQuantum(alpha*q->green);
+        q->blue=ClampToQuantum(alpha*q->blue);
         q++;
       }
     }
-  if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
+  if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum) ||
+      (quantum_type == BGROQuantum))
     {
       register PixelPacket
         *restrict q;
@@ -314,9 +319,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       q=GetAuthenticPixelQueue(image);
       if (image_view != (CacheView *) NULL)
         q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
-      for (x=0; x < (long) number_pixels; x++)
+      for (x=0; x < (ssize_t) number_pixels; x++)
       {
-        q->opacity=(Quantum) (QuantumRange-q->opacity);
+        q->opacity=(Quantum) GetAlphaPixelComponent(q);
         q++;
       }
     }
@@ -331,7 +336,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       q=GetAuthenticPixelQueue(image);
       if (image_view != (CacheView *) NULL)
         q=GetAuthenticPixelQueue(image);
-      for (x=0; x < (long) number_pixels; x++)
+      for (x=0; x < (ssize_t) number_pixels; x++)
       {
         quantum=q->red;
         q->red=q->green;
@@ -361,7 +366,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=((long) number_pixels-7); x > 0; x-=8)
+          for (x=((ssize_t) number_pixels-7); x > 0; x-=8)
           {
             pixel=(unsigned char) *indexes++;
             *q=((pixel & 0x01) << 7);
@@ -384,7 +389,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           if ((number_pixels % 8) != 0)
             {
               *q='\0';
-              for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
+              for (bit=7; bit >= (ssize_t) (8-(number_pixels % 8)); bit--)
               {
                 pixel=(unsigned char) *indexes++;
                 *q|=((pixel & 0x01) << (unsigned char) bit);
@@ -398,7 +403,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) (number_pixels-1) ; x+=2)
+          for (x=0; x < (ssize_t) (number_pixels-1) ; x+=2)
           {
             pixel=(unsigned char) *indexes++;
             *q=((pixel & 0xf) << 4);
@@ -416,7 +421,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 8:
         {
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             q=PopCharPixel((unsigned char) indexes[x],q);
             q+=quantum_info->pad;
@@ -425,7 +430,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 16:
         {
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                q=PopShortPixel(endian,SinglePrecisionToHalf(QuantumScale*
+                  indexes[x]),q);
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             q=PopShortPixel(endian,(unsigned short) indexes[x],q);
             q+=quantum_info->pad;
@@ -436,7 +451,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
                 p++;
@@ -444,9 +459,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopLongPixel(endian,(unsigned long) indexes[x],q);
+            q=PopLongPixel(endian,(unsigned int) indexes[x],q);
             q+=quantum_info->pad;
           }
           break;
@@ -455,7 +470,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
                 p++;
@@ -466,9 +481,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,indexes[x],q);
             p++;
             q+=quantum_info->pad;
           }
@@ -492,29 +507,29 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=((long) number_pixels-3); x > 0; x-=4)
+          for (x=((ssize_t) number_pixels-3); x > 0; x-=4)
           {
             pixel=(unsigned char) *indexes++;
             *q=((pixel & 0x01) << 7);
-            pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == (Quantum) TransparentOpacity ?
               1 : 0);
             *q|=((pixel & 0x01) << 6);
             p++;
             pixel=(unsigned char) *indexes++;
             *q|=((pixel & 0x01) << 5);
-            pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == (Quantum) TransparentOpacity ?
               1 : 0);
             *q|=((pixel & 0x01) << 4);
             p++;
             pixel=(unsigned char) *indexes++;
             *q|=((pixel & 0x01) << 3);
-            pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == (Quantum) TransparentOpacity ?
               1 : 0);
             *q|=((pixel & 0x01) << 2);
             p++;
             pixel=(unsigned char) *indexes++;
             *q|=((pixel & 0x01) << 1);
-            pixel=(unsigned char) (p->opacity == (Quantum) TransparentOpacity ?
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == (Quantum) TransparentOpacity ?
               1 : 0);
             *q|=((pixel & 0x01) << 0);
             p++;
@@ -523,11 +538,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           if ((number_pixels % 4) != 0)
             {
               *q='\0';
-              for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
+              for (bit=3; bit >= (ssize_t) (4-(number_pixels % 4)); bit-=2)
               {
                 pixel=(unsigned char) *indexes++;
                 *q|=((pixel & 0x01) << (unsigned char) (bit+4));
-                pixel=(unsigned char) (p->opacity == (Quantum)
+                pixel=(unsigned char) (GetOpacityPixelComponent(p) == (Quantum)
                   TransparentOpacity ? 1 : 0);
                 *q|=((pixel & 0x01) << (unsigned char) (bit+4-1));
                 p++;
@@ -536,33 +551,532 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
             }
           break;
         }
-        case 4:
+        case 4:
+        {
+          register unsigned char
+            pixel;
+
+          for (x=0; x < (ssize_t) number_pixels ; x++)
+          {
+            pixel=(unsigned char) *indexes++;
+            *q=((pixel & 0xf) << 4);
+            pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)))+0.5);
+            *q|=((pixel & 0xf) << 0);
+            p++;
+            q++;
+          }
+          break;
+        }
+        case 8:
+        {
+          register unsigned char
+            pixel;
+
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            q=PopCharPixel((unsigned char) indexes[x],q);
+            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
+            q=PopCharPixel(pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 16:
+        {
+          register unsigned short
+            pixel;
+
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                q=PopShortPixel(endian,(unsigned short) indexes[x],q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            q=PopShortPixel(endian,(unsigned short) indexes[x],q);
+            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
+            q=PopShortPixel(endian,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 32:
+        {
+          register unsigned int
+            pixel;
+
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                float
+                  pixel;
+
+                q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
+                pixel=(float)  (GetAlphaPixelComponent(p));
+                q=PopFloatPixel(&quantum_state,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            q=PopLongPixel(endian,(unsigned int) indexes[x],q);
+            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
+            q=PopLongPixel(endian,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 64:
+        {
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                double
+                  pixel;
+
+                q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
+                pixel=(double) (GetAlphaPixelComponent(p));
+                q=PopDoublePixel(&quantum_state,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+        }
+        default:
+        {
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,indexes[x],q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) (GetAlphaPixelComponent(p)),range),q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+      }
+      break;
+    }
+    case BGRQuantum:
+    {
+      switch (quantum_info->depth)
+      {
+        case 8:
+        {
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            q=PopCharPixel(ScaleQuantumToChar(GetBluePixelComponent(p)),q);
+            q=PopCharPixel(ScaleQuantumToChar(GetGreenPixelComponent(p)),q);
+            q=PopCharPixel(ScaleQuantumToChar(GetRedPixelComponent(p)),q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 10:
+        {
+          register unsigned int
+            pixel;
+
+          range=GetQuantumRange(quantum_info->depth);
+          if (quantum_info->pack == MagickFalse)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=(unsigned int) (ScaleQuantumToAny(GetRedPixelComponent(p),range) << 22 |
+                  ScaleQuantumToAny(GetGreenPixelComponent(p),range) << 12 |
+                  ScaleQuantumToAny(GetBluePixelComponent(p),range) << 2);
+                q=PopLongPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          if (quantum_info->quantum == 32UL)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 12:
+        {
+          register unsigned int
+            pixel;
+
+          range=GetQuantumRange(quantum_info->depth);
+          if (quantum_info->pack == MagickFalse)
+            {
+              for (x=0; x < (ssize_t) (3*number_pixels-1); x+=2)
+              {
+                switch (x % 3)
+                {
+                  default:
+                  case 0:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                    break;
+                  }
+                  case 1:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                    break;
+                  }
+                  case 2:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                    p++;
+                    break;
+                  }
+                }
+                q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
+                switch ((x+1) % 3)
+                {
+                  default:
+                  case 0:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                    break;
+                  }
+                  case 1:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                    break;
+                  }
+                  case 2:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                    p++;
+                    break;
+                  }
+                }
+                q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
+                q+=quantum_info->pad;
+              }
+              for (bit=0; bit < (ssize_t) (3*number_pixels % 2); bit++)
+              {
+                switch ((x+bit) % 3)
+                {
+                  default:
+                  case 0:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                    break;
+                  }
+                  case 1:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                    break;
+                  }
+                  case 2:
+                  {
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                    p++;
+                    break;
+                  }
+                }
+                q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
+                q+=quantum_info->pad;
+              }
+              if (bit != 0)
+                p++;
+              break;
+            }
+          if (quantum_info->quantum == 32UL)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 16:
+        {
+          register unsigned short
+            pixel;
+
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 32:
+        {
+          register unsigned int
+            pixel;
+
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 64:
+        {
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+        }
+        default:
         {
-          register unsigned char
-            pixel;
-
-          for (x=0; x < (long) number_pixels ; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=(unsigned char) *indexes++;
-            *q=((pixel & 0xf) << 4);
-            pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
-              p->opacity))+0.5);
-            *q|=((pixel & 0xf) << 0);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
             p++;
-            q++;
+            q+=quantum_info->pad;
           }
           break;
         }
+      }
+      break;
+    }
+    case BGRAQuantum:
+    case BGROQuantum:
+    {
+      switch (quantum_info->depth)
+      {
         case 8:
         {
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopCharPixel((unsigned char) indexes[x],q);
-            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
+            q=PopCharPixel(pixel,q);
+            pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
+            q=PopCharPixel(pixel,q);
+            pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
             q=PopCharPixel(pixel,q);
+            pixel=ScaleQuantumToChar((Quantum) GetAlphaPixelComponent(p));
+            q=PopCharPixel(pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
+        case 10:
+        {
+          register unsigned int
+            pixel;
+
+          range=GetQuantumRange(quantum_info->depth);
+          if (quantum_info->pack == MagickFalse)
+            {
+              register ssize_t
+                i;
+
+              size_t
+                quantum;
+
+              ssize_t
+                n;
+
+              n=0;
+              quantum=0;
+              pixel=0;
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                for (i=0; i < 4; i++)
+                {
+                  switch (i)
+                  {
+                    case 0: quantum=GetRedPixelComponent(p); break;
+                    case 1: quantum=GetGreenPixelComponent(p); break;
+                    case 2: quantum=GetBluePixelComponent(p); break;
+                    case 3: quantum=(Quantum) (QuantumRange-GetOpacityPixelComponent(p)); break;
+                  }
+                  switch (n % 3)
+                  {
+                    case 0:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 22);
+                      break;
+                    }
+                    case 1:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 12);
+                      break;
+                    }
+                    case 2:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 2);
+                      q=PopLongPixel(endian,pixel,q);
+                      pixel=0;
+                      break;
+                    }
+                  }
+                  n++;
+                }
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          if (quantum_info->quantum == 32UL)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny((Quantum) (QuantumRange-
+                  GetOpacityPixelComponent(p)),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
             p++;
             q+=quantum_info->pad;
           }
@@ -573,10 +1087,36 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopShortPixel(endian,(unsigned short) indexes[x],q);
-            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
+            q=PopShortPixel(endian,pixel,q);
+            pixel=ScaleQuantumToShort((Quantum) GetAlphaPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -585,28 +1125,35 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
 
-                q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
-                pixel=(float)  (QuantumRange-p->opacity);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
+                pixel=(float) GetAlphaPixelComponent(p);
                 q=PopFloatPixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopLongPixel(endian,(unsigned long) indexes[x],q);
-            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
+            q=PopLongPixel(endian,pixel,q);
+            pixel=ScaleQuantumToLong((Quantum) GetAlphaPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -617,13 +1164,15 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
-              {
-                double
-                  pixel;
+              double
+                pixel;
 
-                q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
-                pixel=(double) (QuantumRange-p->opacity);
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
+                pixel=(double) GetAlphaPixelComponent(p);
                 q=PopDoublePixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -633,12 +1182,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,indexes[x],q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              (Quantum) (QuantumRange-p->opacity),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) GetAlphaPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -668,7 +1222,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               white=0x00;
             }
           threshold=(Quantum) (QuantumRange/2);
-          for (x=((long) number_pixels-7); x > 0; x-=8)
+          for (x=((ssize_t) number_pixels-7); x > 0; x-=8)
           {
             *q='\0';
             *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
@@ -692,7 +1246,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           if ((number_pixels % 8) != 0)
             {
               *q='\0';
-              for (bit=7; bit >= (long) (8-(number_pixels % 8)); bit--)
+              for (bit=7; bit >= (ssize_t) (8-(number_pixels % 8)); bit--)
               {
                 *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
                   bit;
@@ -707,7 +1261,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) (number_pixels-1) ; x+=2)
+          for (x=0; x < (ssize_t) (number_pixels-1) ; x+=2)
           {
             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
             *q=(((pixel >> 4) & 0xf) << 4);
@@ -731,7 +1285,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
             q=PopCharPixel(pixel,q);
@@ -742,26 +1296,36 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 10:
         {
-          register unsigned short
-            pixel;
-
-          range=GetQuantumRange(image->depth);
+          range=GetQuantumRange(quantum_info->depth);
           if (quantum_info->pack == MagickFalse)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              register unsigned int
+                pixel;
+
+              for (x=0; x < (ssize_t) (number_pixels-2); x+=3)
               {
-                pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
-                q=PopShortPixel(endian,(unsigned short) ScaleQuantumToAny(
-                  (Quantum) pixel,range),q);
-                p++;
+                pixel=(unsigned int) (
+                  ScaleQuantumToAny(PixelIntensityToQuantum(p+2),range) << 22 |
+                  ScaleQuantumToAny(PixelIntensityToQuantum(p+1),range) << 12 |
+                  ScaleQuantumToAny(PixelIntensityToQuantum(p+0),range) << 2);
+                q=PopLongPixel(endian,pixel,q);
+                p+=3;
                 q+=quantum_info->pad;
               }
+              pixel=0UL;
+              if (x++ < (ssize_t) (number_pixels-1))
+                pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+1),
+                  range) << 12;
+              if (x++ < (ssize_t) number_pixels)
+                pixel|=ScaleQuantumToAny(PixelIntensityToQuantum(p+0),
+                  range) << 2;
+              q=PopLongPixel(endian,pixel,q);
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              PixelIntensityToQuantum(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(PixelIntensityToQuantum(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -772,10 +1336,10 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          range=GetQuantumRange(image->depth);
+          range=GetQuantumRange(quantum_info->depth);
           if (quantum_info->pack == MagickFalse)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
                 q=PopShortPixel(endian,(unsigned short) (pixel >> 4),q);
@@ -784,10 +1348,10 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              PixelIntensityToQuantum(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(PixelIntensityToQuantum(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -798,7 +1362,19 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  PixelIntensityToQuantum(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
             q=PopShortPixel(endian,pixel,q);
@@ -809,12 +1385,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
@@ -826,7 +1402,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
             q=PopLongPixel(endian,pixel,q);
@@ -839,7 +1415,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 double
                   pixel;
@@ -854,11 +1430,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              PixelIntensityToQuantum(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(PixelIntensityToQuantum(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -889,23 +1465,23 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               white=0x00;
             }
           threshold=(Quantum) (QuantumRange/2);
-          for (x=((long) number_pixels-3); x > 0; x-=4)
+          for (x=((ssize_t) number_pixels-3); x > 0; x-=4)
           {
             *q='\0';
-            *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 7;
-            pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
+            *q|=(PixelIntensityToQuantum(p) > threshold ? black : white) << 7;
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == OpaqueOpacity ? 0x00 : 0x01);
             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 6);
             p++;
-            *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 5;
-            pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
+            *q|=(PixelIntensityToQuantum(p) > threshold ? black : white) << 5;
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == OpaqueOpacity ? 0x00 : 0x01);
             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 4);
             p++;
-            *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 3;
-            pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
+            *q|=(PixelIntensityToQuantum(p) > threshold ? black : white) << 3;
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == OpaqueOpacity ? 0x00 : 0x01);
             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 2);
             p++;
-            *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) << 1;
-            pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 : 0x01);
+            *q|=(PixelIntensityToQuantum(p) > threshold ? black : white) << 1;
+            pixel=(unsigned char) (GetOpacityPixelComponent(p) == OpaqueOpacity ? 0x00 : 0x01);
             *q|=(((int) pixel != 0 ? 0x00 : 0x01) << 0);
             p++;
             q++;
@@ -913,14 +1489,14 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           if ((number_pixels % 4) != 0)
             {
               *q='\0';
-              for (bit=3; bit >= (long) (4-(number_pixels % 4)); bit-=2)
+              for (bit=0; bit <= (ssize_t) (number_pixels % 4); bit+=2)
               {
-                *q|=(PixelIntensityToQuantum(p) < threshold ? black : white) <<
-                  (bit+4);
-                pixel=(unsigned char) (p->opacity == OpaqueOpacity ? 0x00 :
+                *q|=(PixelIntensityToQuantum(p) > threshold ? black : white) <<
+                  (7-bit);
+                pixel=(unsigned char) (GetOpacityPixelComponent(p) == OpaqueOpacity ? 0x00 :
                   0x01);
                 *q|=(((int) pixel != 0 ? 0x00 : 0x01) << (unsigned char)
-                  (bit+4-1));
+                  (7-bit-1));
                 p++;
               }
               q++;
@@ -932,12 +1508,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels ; x++)
+          for (x=0; x < (ssize_t) number_pixels ; x++)
           {
             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
             *q=(((pixel >> 4) & 0xf) << 4);
             pixel=(unsigned char) (16*QuantumScale*((Quantum) (QuantumRange-
-              p->opacity))+0.5);
+              GetOpacityPixelComponent(p)))+0.5);
             *q|=pixel & 0xf;
             p++;
             q++;
@@ -949,11 +1525,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToChar(PixelIntensityToQuantum(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -965,11 +1542,27 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  PixelIntensityToQuantum(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -978,30 +1571,31 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
 
                 pixel=(float) PixelIntensityToQuantum(p);
                 q=PopFloatPixel(&quantum_state,pixel,q);
-                pixel=(float) (QuantumRange-p->opacity);
+                pixel=(float) (GetAlphaPixelComponent(p));
                 q=PopFloatPixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToLong(PixelIntensityToQuantum(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1012,14 +1606,14 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 double
                   pixel;
 
                 pixel=(double) PixelIntensityToQuantum(p);
                 q=PopDoublePixel(&quantum_state,pixel,q);
-                pixel=(double) (QuantumRange-p->opacity);
+                pixel=(double) (GetAlphaPixelComponent(p));
                 q=PopDoublePixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -1029,13 +1623,13 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              PixelIntensityToQuantum(p),range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              (Quantum) (QuantumRange-p->opacity),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(PixelIntensityToQuantum(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) (GetAlphaPixelComponent(p)),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1054,9 +1648,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->red);
+            pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1068,9 +1662,21 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->red);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1079,22 +1685,22 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->red,q);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->red);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1105,9 +1711,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->red,q);
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
@@ -1116,11 +1722,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->red,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1139,9 +1745,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->green);
+            pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1153,9 +1759,21 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->green);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1164,22 +1782,22 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->green,q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->green);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1190,9 +1808,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->green,q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
@@ -1201,11 +1819,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->green,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1224,9 +1842,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->blue);
+            pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1238,9 +1856,21 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->blue);
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1249,22 +1879,22 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->blue,q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->blue);
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1275,9 +1905,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->blue,q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
@@ -1286,11 +1916,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->blue,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1308,9 +1938,10 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1322,9 +1953,22 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1333,26 +1977,27 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
 
-                pixel=(float) (QuantumRange-p->opacity);
+                pixel=(float) (GetAlphaPixelComponent(p));
                 q=PopFloatPixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1363,12 +2008,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 double
                   pixel;
 
-                pixel=(double) (QuantumRange-p->opacity);
+                pixel=(double) (GetAlphaPixelComponent(p));
                 q=PopDoublePixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -1378,11 +2023,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              (Quantum) (QuantumRange-p->opacity),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) (GetAlphaPixelComponent(p)),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1400,9 +2045,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->opacity);
+            pixel=ScaleQuantumToChar(GetOpacityPixelComponent(p));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1414,9 +2059,21 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetOpacityPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->opacity);
+            pixel=ScaleQuantumToShort(GetOpacityPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1425,22 +2082,22 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->opacity,q);
+                q=PopFloatPixel(&quantum_state,(float) GetOpacityPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->opacity);
+            pixel=ScaleQuantumToLong(GetOpacityPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1451,9 +2108,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->opacity,q);
+                q=PopDoublePixel(&quantum_state,(double) GetOpacityPixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
@@ -1462,11 +2119,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->opacity,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetOpacityPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1490,7 +2147,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToChar(indexes[x]);
             q=PopCharPixel(pixel,q);
@@ -1504,7 +2161,18 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToShort(indexes[x]);
             q=PopShortPixel(endian,pixel,q);
@@ -1515,12 +2183,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
                 p++;
@@ -1528,7 +2196,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
             pixel=ScaleQuantumToLong(indexes[x]);
             q=PopLongPixel(endian,pixel,q);
@@ -1541,7 +2209,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
                 p++;
@@ -1552,11 +2220,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              (Quantum) indexes[x],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) indexes[x],range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1572,11 +2240,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       {
         case 8:
         {
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopCharPixel(ScaleQuantumToChar(p->red),q);
-            q=PopCharPixel(ScaleQuantumToChar(p->green),q);
-            q=PopCharPixel(ScaleQuantumToChar(p->blue),q);
+            q=PopCharPixel(ScaleQuantumToChar(GetRedPixelComponent(p)),q);
+            q=PopCharPixel(ScaleQuantumToChar(GetGreenPixelComponent(p)),q);
+            q=PopCharPixel(ScaleQuantumToChar(GetBluePixelComponent(p)),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1584,17 +2252,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 10:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
-          range=GetQuantumRange(image->depth);
+          range=GetQuantumRange(quantum_info->depth);
           if (quantum_info->pack == MagickFalse)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                pixel=(unsigned long) (ScaleQuantumToAny(p->red,range) << 22 |
-                  ScaleQuantumToAny(p->green,range) <<  12 |
-                  ScaleQuantumToAny(p->blue,range) << 2);
+                pixel=(unsigned int) (ScaleQuantumToAny(GetRedPixelComponent(p),range) << 22 |
+                  ScaleQuantumToAny(GetGreenPixelComponent(p),range) << 12 |
+                  ScaleQuantumToAny(GetBluePixelComponent(p),range) << 2);
                 q=PopLongPixel(endian,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -1603,27 +2271,30 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
             }
           if (quantum_info->quantum == 32UL)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
-                pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
-                pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
-            pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
-            pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1631,30 +2302,30 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 12:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
-          range=GetQuantumRange(image->depth);
+          range=GetQuantumRange(quantum_info->depth);
           if (quantum_info->pack == MagickFalse)
             {
-              for (x=0; x < (long) (3*number_pixels-1); x+=2)
+              for (x=0; x < (ssize_t) (3*number_pixels-1); x+=2)
               {
                 switch (x % 3)
                 {
                   default:
                   case 0:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
                     break;
                   }
                   case 1:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                     break;
                   }
                   case 2:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
                     p++;
                     break;
                   }
@@ -1665,17 +2336,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
                   default:
                   case 0:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
                     break;
                   }
                   case 1:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                     break;
                   }
                   case 2:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
                     p++;
                     break;
                   }
@@ -1683,24 +2354,24 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
                 q=PopShortPixel(endian,(unsigned short) (pixel << 4),q);
                 q+=quantum_info->pad;
               }
-              for (bit=0; bit < (long) (3*number_pixels % 2); bit++)
+              for (bit=0; bit < (ssize_t) (3*number_pixels % 2); bit++)
               {
                 switch ((x+bit) % 3)
                 {
                   default:
                   case 0:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
                     break;
                   }
                   case 1:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                     break;
                   }
                   case 2:
                   {
-                    pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
+                    pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
                     p++;
                     break;
                   }
@@ -1714,27 +2385,30 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
             }
           if (quantum_info->quantum == 32UL)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
-                pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
-                pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
-                q=PopQuantumLongPixel(&quantum_state,image->depth,pixel,q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=(unsigned long) ScaleQuantumToAny(p->red,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
-            pixel=(unsigned long) ScaleQuantumToAny(p->green,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
-            pixel=(unsigned long) ScaleQuantumToAny(p->blue,range);
-            q=PopQuantumPixel(&quantum_state,image->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1745,13 +2419,31 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->red);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->green);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->blue);
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1760,28 +2452,28 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->red,q);
-                q=PopFloatPixel(&quantum_state,(float) p->green,q);
-                q=PopFloatPixel(&quantum_state,(float) p->blue,q);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->red);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->green);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->blue);
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1792,11 +2484,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->red,q);
-                q=PopDoublePixel(&quantum_state,(double) p->green,q);
-                q=PopDoublePixel(&quantum_state,(double) p->blue,q);
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
                 p++;
                 q+=quantum_info->pad;
               }
@@ -1805,15 +2497,15 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->red,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->green,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->blue,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1833,35 +2525,155 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->red);
+            pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->green);
+            pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->blue);
+            pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToChar((Quantum) GetAlphaPixelComponent(p));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
           }
           break;
         }
+        case 10:
+        {
+          register unsigned int
+            pixel;
+
+          range=GetQuantumRange(quantum_info->depth);
+          if (quantum_info->pack == MagickFalse)
+            {
+              register ssize_t
+                i;
+
+              size_t
+                quantum;
+
+              ssize_t
+                n;
+
+              n=0;
+              quantum=0;
+              pixel=0;
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                for (i=0; i < 4; i++)
+                {
+                  switch (i)
+                  {
+                    case 0: quantum=GetRedPixelComponent(p); break;
+                    case 1: quantum=GetGreenPixelComponent(p); break;
+                    case 2: quantum=GetBluePixelComponent(p); break;
+                    case 3: quantum=(Quantum) (QuantumRange-GetOpacityPixelComponent(p)); break;
+                  }
+                  switch (n % 3)
+                  {
+                    case 0:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 22);
+                      break;
+                    }
+                    case 1:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 12);
+                      break;
+                    }
+                    case 2:
+                    {
+                      pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum,
+                        range) << 2);
+                      q=PopLongPixel(endian,pixel,q);
+                      pixel=0;
+                      break;
+                    }
+                  }
+                  n++;
+                }
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          if (quantum_info->quantum == 32UL)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                pixel=(unsigned int) ScaleQuantumToAny((Quantum) (QuantumRange-
+                  GetOpacityPixelComponent(p)),range);
+                q=PopQuantumLongPixel(&quantum_state,quantum_info->depth,pixel,
+                  q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            pixel=(unsigned int) ScaleQuantumToAny(GetRedPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetGreenPixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny(GetBluePixelComponent(p),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            pixel=(unsigned int) ScaleQuantumToAny((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)),range);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,pixel,q);
+            p++;
+            q+=quantum_info->pad;
+          }
+          break;
+        }
         case 16:
         {
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->red);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->green);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->blue);
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToShort((Quantum) GetAlphaPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1870,35 +2682,35 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
 
-                q=PopFloatPixel(&quantum_state,(float) p->red,q);
-                q=PopFloatPixel(&quantum_state,(float) p->green,q);
-                q=PopFloatPixel(&quantum_state,(float) p->blue,q);
-                pixel=(float) (QuantumRange-p->opacity);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
+                pixel=(float) GetAlphaPixelComponent(p);
                 q=PopFloatPixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->red);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->green);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->blue);
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToLong((Quantum) GetAlphaPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -1912,12 +2724,12 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               double
                 pixel;
 
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->red,q);
-                q=PopDoublePixel(&quantum_state,(double) p->green,q);
-                q=PopDoublePixel(&quantum_state,(double) p->blue,q);
-                pixel=(double) (QuantumRange-p->opacity);
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
+                pixel=(double) GetAlphaPixelComponent(p);
                 q=PopDoublePixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -1927,17 +2739,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->red,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->green,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->blue,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              (Quantum) (QuantumRange-p->opacity),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny((Quantum) GetAlphaPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -1961,13 +2773,13 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->red);
+            pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->green);
+            pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->blue);
+            pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
             q=PopCharPixel(pixel,q);
             pixel=ScaleQuantumToChar(indexes[x]);
             q=PopCharPixel(pixel,q);
@@ -1981,13 +2793,33 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->red);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->green);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->blue);
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             pixel=ScaleQuantumToShort(indexes[x]);
             q=PopShortPixel(endian,pixel,q);
@@ -1998,29 +2830,29 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopFloatPixel(&quantum_state,(float) p->red,q);
-                q=PopFloatPixel(&quantum_state,(float) p->green,q);
-                q=PopFloatPixel(&quantum_state,(float) p->blue,q);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->red);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->green);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->blue);
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             pixel=ScaleQuantumToLong(indexes[x]);
             q=PopLongPixel(endian,pixel,q);
@@ -2033,11 +2865,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         {
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->red,q);
-                q=PopDoublePixel(&quantum_state,(double) p->green,q);
-                q=PopDoublePixel(&quantum_state,(double) p->blue,q);
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
                 p++;
                 q+=quantum_info->pad;
@@ -2047,17 +2879,17 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->red,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->green,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->blue,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              indexes[x],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetIndexPixelComponent(indexes+x),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -2082,17 +2914,18 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned char
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToChar(p->red);
+            pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->green);
+            pixel=ScaleQuantumToChar(GetGreenPixelComponent(p));
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar(p->blue);
+            pixel=ScaleQuantumToChar(GetBluePixelComponent(p));
             q=PopCharPixel(pixel,q);
             pixel=ScaleQuantumToChar(indexes[x]);
             q=PopCharPixel(pixel,q);
-            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToChar((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopCharPixel(pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -2104,17 +2937,41 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
           register unsigned short
             pixel;
 
-          for (x=0; x < (long) number_pixels; x++)
+          if (quantum_info->format == FloatingPointQuantumFormat)
+            {
+              for (x=0; x < (ssize_t) number_pixels; x++)
+              {
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetRedPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetGreenPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetBluePixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*indexes[x]);
+                q=PopShortPixel(endian,pixel,q);
+                pixel=SinglePrecisionToHalf(QuantumScale*
+                  GetAlphaPixelComponent(p));
+                q=PopShortPixel(endian,pixel,q);
+                p++;
+                q+=quantum_info->pad;
+              }
+              break;
+            }
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToShort(p->red);
+            pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->green);
+            pixel=ScaleQuantumToShort(GetGreenPixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort(p->blue);
+            pixel=ScaleQuantumToShort(GetBluePixelComponent(p));
             q=PopShortPixel(endian,pixel,q);
             pixel=ScaleQuantumToShort(indexes[x]);
             q=PopShortPixel(endian,pixel,q);
-            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToShort((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopShortPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -2123,38 +2980,39 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         case 32:
         {
-          register unsigned long
+          register unsigned int
             pixel;
 
           if (quantum_info->format == FloatingPointQuantumFormat)
             {
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
                 float
                   pixel;
 
-                q=PopFloatPixel(&quantum_state,(float) p->red,q);
-                q=PopFloatPixel(&quantum_state,(float) p->green,q);
-                q=PopFloatPixel(&quantum_state,(float) p->blue,q);
+                q=PopFloatPixel(&quantum_state,(float) GetRedPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetGreenPixelComponent(p),q);
+                q=PopFloatPixel(&quantum_state,(float) GetBluePixelComponent(p),q);
                 q=PopFloatPixel(&quantum_state,(float) indexes[x],q);
-                pixel=(float) (QuantumRange-p->opacity);
+                pixel=(float) (GetAlphaPixelComponent(p));
                 q=PopFloatPixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
               }
               break;
             }
-          for (x=0; x < (long) number_pixels; x++)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            pixel=ScaleQuantumToLong(p->red);
+            pixel=ScaleQuantumToLong(GetRedPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->green);
+            pixel=ScaleQuantumToLong(GetGreenPixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong(p->blue);
+            pixel=ScaleQuantumToLong(GetBluePixelComponent(p));
             q=PopLongPixel(endian,pixel,q);
             pixel=ScaleQuantumToLong(indexes[x]);
             q=PopLongPixel(endian,pixel,q);
-            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-p->opacity));
+            pixel=ScaleQuantumToLong((Quantum) (QuantumRange-
+              GetOpacityPixelComponent(p)));
             q=PopLongPixel(endian,pixel,q);
             p++;
             q+=quantum_info->pad;
@@ -2168,13 +3026,13 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               double
                 pixel;
 
-              for (x=0; x < (long) number_pixels; x++)
+              for (x=0; x < (ssize_t) number_pixels; x++)
               {
-                q=PopDoublePixel(&quantum_state,(double) p->red,q);
-                q=PopDoublePixel(&quantum_state,(double) p->green,q);
-                q=PopDoublePixel(&quantum_state,(double) p->blue,q);
+                q=PopDoublePixel(&quantum_state,(double) GetRedPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetGreenPixelComponent(p),q);
+                q=PopDoublePixel(&quantum_state,(double) GetBluePixelComponent(p),q);
                 q=PopDoublePixel(&quantum_state,(double) indexes[x],q);
-                pixel=(double) (QuantumRange-p->opacity);
+                pixel=(double) (GetAlphaPixelComponent(p));
                 q=PopDoublePixel(&quantum_state,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -2184,19 +3042,19 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          range=GetQuantumRange(image->depth);
-          for (x=0; x < (long) number_pixels; x++)
+          range=GetQuantumRange(quantum_info->depth);
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->red,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->green,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->blue,range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              indexes[x],range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              p->opacity,range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetRedPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetGreenPixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetBluePixelComponent(p),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetIndexPixelComponent(indexes+x),range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(GetOpacityPixelComponent(p),range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -2207,31 +3065,31 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
     }
     case CbYCrYQuantum:
     {
-     long
-        n;
-
       Quantum
         cbcr[4];
 
-      register long
+      register ssize_t
         i;
 
-      register unsigned long
+      register unsigned int
         pixel;
 
-      unsigned long
+      size_t
         quantum;
 
+     ssize_t
+        n;
+
       n=0;
       quantum=0;
-      range=GetQuantumRange(image->depth);
+      range=GetQuantumRange(quantum_info->depth);
       switch (quantum_info->depth)
       {
         case 10:
         {
           if (quantum_info->pack == MagickFalse)
             {
-              for (x=0; x < (long) number_pixels; x+=2)
+              for (x=0; x < (ssize_t) number_pixels; x+=2)
               {
                 for (i=0; i < 4; i++)
                 {
@@ -2239,31 +3097,31 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
                   {
                     case 0:
                     {
-                      quantum=p->red;
+                      quantum=GetRedPixelComponent(p);
                       break;
                     }
                     case 1:
                     {
-                      quantum=p->green;
+                      quantum=GetGreenPixelComponent(p);
                       break;
                     }
                     case 2:
                     {
-                      quantum=p->blue;
+                      quantum=GetBluePixelComponent(p);
                       break;
                     }
                   }
                   cbcr[i]=(Quantum) quantum;
                   n++;
                 }
-                pixel=(unsigned long) ((unsigned long) (cbcr[1]) << 22 |
-                  (unsigned long) (cbcr[0]) <<  12 |
-                  (unsigned long) (cbcr[2]) << 2);
+                pixel=(unsigned int) ((size_t) (cbcr[1]) << 22 |
+                  (size_t) (cbcr[0]) << 12 |
+                  (size_t) (cbcr[2]) << 2);
                 q=PopLongPixel(endian,pixel,q);
                 p++;
-                pixel=(unsigned long) ((unsigned long) (cbcr[3]) << 22 |
-                  (unsigned long) (cbcr[0]) <<  12 |
-                  (unsigned long) (cbcr[2]) << 2);
+                pixel=(unsigned int) ((size_t) (cbcr[3]) << 22 |
+                  (size_t) (cbcr[0]) << 12 |
+                  (size_t) (cbcr[2]) << 2);
                 q=PopLongPixel(endian,pixel,q);
                 p++;
                 q+=quantum_info->pad;
@@ -2274,7 +3132,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         }
         default:
         {
-          for (x=0; x < (long) number_pixels; x+=2)
+          for (x=0; x < (ssize_t) number_pixels; x+=2)
           {
             for (i=0; i < 4; i++)
             {
@@ -2282,36 +3140,36 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
               {
                 case 0:
                 {
-                  quantum=p->red;
+                  quantum=GetRedPixelComponent(p);
                   break;
                 }
                 case 1:
                 {
-                  quantum=p->green;
+                  quantum=GetGreenPixelComponent(p);
                   break;
                 }
                 case 2:
                 {
-                  quantum=p->blue;
+                  quantum=GetBluePixelComponent(p);
                   break;
                 }
               }
               cbcr[i]=(Quantum) quantum;
               n++;
             }
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[1],range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[0],range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[2],range),q);
-            p++;
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[3],range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[0],range),q);
-            q=PopQuantumPixel(&quantum_state,image->depth,ScaleQuantumToAny(
-              cbcr[2],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[1],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[0],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[2],range),q);
+            p++;
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[3],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[0],range),q);
+            q=PopQuantumPixel(&quantum_state,quantum_info->depth,
+              ScaleQuantumToAny(cbcr[2],range),q);
             p++;
             q+=quantum_info->pad;
           }
@@ -2334,7 +3192,7 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       q=GetAuthenticPixelQueue(image);
       if (image_view != (CacheView *) NULL)
         q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
-      for (x=0; x < (long) number_pixels; x++)
+      for (x=0; x < (ssize_t) number_pixels; x++)
       {
         quantum=q->red;
         q->red=q->green;
@@ -2342,7 +3200,8 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
         q++;
       }
     }
-  if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum))
+  if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum) ||
+      (quantum_type == BGROQuantum))
     {
       register PixelPacket
         *restrict q;
@@ -2350,9 +3209,9 @@ MagickExport size_t ExportQuantumPixels(const Image *image,
       q=GetAuthenticPixelQueue(image);
       if (image_view != (CacheView *) NULL)
         q=(PixelPacket *) GetCacheViewVirtualPixelQueue(image_view);
-      for (x=0; x < (long) number_pixels; x++)
+      for (x=0; x < (ssize_t) number_pixels; x++)
       {
-        q->opacity=(Quantum) (QuantumRange-q->opacity);
+        q->opacity=(Quantum) GetAlphaPixelComponent(q);
         q++;
       }
     }