Index: /ImageMagick/branches/ImageMagick-6/coders/jp2.c
===================================================================
--- /ImageMagick/branches/ImageMagick-6/coders/jp2.c	(revision 8046)
+++ /ImageMagick/branches/ImageMagick-6/coders/jp2.c	(revision 8048)
@@ -447,4 +447,46 @@
       components[1]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_YCBCR_CB);
       components[2]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_YCBCR_CR);
+      if ((components[0] < 0) || (components[1] < 0) || (components[2] < 0))
+        {
+          (void) jas_stream_close(jp2_stream);
+          jas_image_destroy(jp2_image);
+          ThrowReaderException(CorruptImageError,"MissingImageChannel");
+        }
+      number_components=3;
+      components[3]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_UNKNOWN);
+      if (components[3] > 0)
+        {
+          image->matte=MagickTrue;
+          number_components++;
+        }
+      break;
+    }
+    case JAS_CLRSPC_FAM_XYZ:
+    {
+      SetImageColorspace(image,XYZColorspace);
+      components[0]=jas_image_getcmptbytype(jp2_image,0);
+      components[1]=jas_image_getcmptbytype(jp2_image,1);
+      components[2]=jas_image_getcmptbytype(jp2_image,2);
+      if ((components[0] < 0) || (components[1] < 0) || (components[2] < 0))
+        {
+          (void) jas_stream_close(jp2_stream);
+          jas_image_destroy(jp2_image);
+          ThrowReaderException(CorruptImageError,"MissingImageChannel");
+        }
+      number_components=3;
+      components[3]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_UNKNOWN);
+      if (components[3] > 0)
+        {
+          image->matte=MagickTrue;
+          number_components++;
+        }
+      break;
+    }
+    case JAS_CLRSPC_FAM_LAB:
+    {
+      SetImageColorspace(image,YCbCrColorspace);
+      components[0]=jas_image_getcmptbytype(jp2_image,0);
+      components[1]=jas_image_getcmptbytype(jp2_image,1);
+      components[2]=jas_image_getcmptbytype(jp2_image,2);
       if ((components[0] < 0) || (components[1] < 0) || (components[2] < 0))
         {
@@ -873,6 +915,5 @@
     ThrowWriterException(DelegateError,"UnableToManageJP2Stream");
   number_components=image->matte ? 4UL : 3UL;
-  if ((image_info->type != TrueColorType) &&
-      (IsGrayImage(image,&image->exception) != MagickFalse))
+  if (IsGrayColorspace(image->colorspace) != MagickFalse)
     number_components=1;
   if ((image->columns != (unsigned int) image->columns) ||
@@ -895,17 +936,11 @@
   if (jp2_image == (jas_image_t *) NULL)
     ThrowWriterException(DelegateError,"UnableToCreateImage");
-  if (number_components == 1)
+  switch (image->colorspace)
+  {
+    case RGBColorspace:
+    case sRGBColorspace:
     {
       /*
-        sRGB Grayscale.
-      */
-      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SGRAY);
-      jas_image_setcmpttype(jp2_image,0,
-        JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
-    }
-  else
-    {
-      /*
-        sRGB.
+        RGB.
       */
       jas_image_setclrspc(jp2_image,JAS_CLRSPC_SRGB);
@@ -918,5 +953,81 @@
       if (number_components == 4)
         jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
-    }
+      break;
+    }
+    case GRAYColorspace:
+    {
+      /*
+        Grayscale.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SGRAY);
+      jas_image_setcmpttype(jp2_image,0,
+        JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
+      break;
+    }
+    case YCbCrColorspace:
+    {
+      /*
+        YCbCr.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SYCBCR);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    case XYZColorspace:
+    {
+      /*
+        YCbCr.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_CIEXYZ);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    case LabColorspace:
+    {
+      /*
+        Lab.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_CIELAB);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    default:
+    {
+      /*
+        Unknow.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_UNKNOWN);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+  }
   /*
     Convert to JPEG 2000 pixels.
