public void jpeg_set_colorspace(J_COLOR_SPACE colorspace)
{
int ci;
/* Safety check to ensure start_compress not called yet. */
if (m_global_state != JpegState.CSTATE_START)
ERREXIT(J_MESSAGE_CODE.JERR_BAD_STATE, (int)m_global_state);
/* For all colorspaces, we use Q and Huff tables 0 for luminance components,
* tables 1 for chrominance components.
*/
m_jpeg_color_space = colorspace;
m_write_JFIF_header = false; /* No marker for non-JFIF colorspaces */
m_write_Adobe_marker = false; /* write no Adobe marker by default */
switch (colorspace)
{
case J_COLOR_SPACE.JCS_UNKNOWN:
m_num_components = m_input_components;
if (m_num_components < 1 || m_num_components > JpegConstants.MAX_COMPONENTS)
ERREXIT(J_MESSAGE_CODE.JERR_COMPONENT_COUNT, m_num_components, JpegConstants.MAX_COMPONENTS);
for (ci = 0; ci < m_num_components; ci++)
jpeg_set_colorspace_SET_COMP(ci, ci, 1, 1, 0, 0, 0);
break;
case J_COLOR_SPACE.JCS_GRAYSCALE:
m_write_JFIF_header = true; /* Write a JFIF marker */
m_num_components = 1;
/* JFIF specifies component ID 1 */
jpeg_set_colorspace_SET_COMP(0, 0x01, 1, 1, 0, 0, 0);
break;
case J_COLOR_SPACE.JCS_RGB:
m_write_Adobe_marker = true; /* write Adobe marker to flag RGB */
m_num_components = 3;
jpeg_set_colorspace_SET_COMP(0, 0x52 /* 'R' */, 1, 1, 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0);
jpeg_set_colorspace_SET_COMP(1, 0x47 /* 'G' */, 1, 1, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(2, 0x42 /* 'B' */, 1, 1, 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0);
break;
case J_COLOR_SPACE.JCS_YCbCr:
m_write_JFIF_header = true; /* Write a JFIF marker */
m_num_components = 3;
/* JFIF specifies component IDs 1,2,3 */
/* We default to 2x2 subsamples of chrominance */
jpeg_set_colorspace_SET_COMP(0, 0x01, 2, 2, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(1, 0x02, 1, 1, 1, 1, 1);
jpeg_set_colorspace_SET_COMP(2, 0x03, 1, 1, 1, 1, 1);
break;
case J_COLOR_SPACE.JCS_CMYK:
m_write_Adobe_marker = true; /* write Adobe marker to flag CMYK */
m_num_components = 4;
jpeg_set_colorspace_SET_COMP(0, 0x43 /* 'C' */, 1, 1, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(1, 0x4D /* 'M' */, 1, 1, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(2, 0x59 /* 'Y' */, 1, 1, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(3, 0x4B /* 'K' */, 1, 1, 0, 0, 0);
break;
case J_COLOR_SPACE.JCS_YCCK:
m_write_Adobe_marker = true; /* write Adobe marker to flag YCCK */
m_num_components = 4;
jpeg_set_colorspace_SET_COMP(0, 0x01, 2, 2, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(1, 0x02, 1, 1, 1, 1, 1);
jpeg_set_colorspace_SET_COMP(2, 0x03, 1, 1, 1, 1, 1);
jpeg_set_colorspace_SET_COMP(3, 0x04, 2, 2, 0, 0, 0);
break;
case J_COLOR_SPACE.JCS_BG_RGB:
m_write_JFIF_header = true; /* Write a JFIF marker */
JFIF_major_version = 2; /* Set JFIF major version = 2 */
m_num_components = 3;
/* Add offset 0x20 to the normal R/G/B component IDs */
jpeg_set_colorspace_SET_COMP(0, 0x72 /* 'r' */, 1, 1, 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0);
jpeg_set_colorspace_SET_COMP(1, 0x67 /* 'g' */, 1, 1, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(2, 0x62 /* 'b' */, 1, 1, 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0,
color_transform == J_COLOR_TRANSFORM.JCT_SUBTRACT_GREEN ? 1 : 0);
break;
case J_COLOR_SPACE.JCS_BG_YCC:
m_write_JFIF_header = true; /* Write a JFIF marker */
JFIF_major_version = 2; /* Set JFIF major version = 2 */
m_num_components = 3;
/* Add offset 0x20 to the normal Cb/Cr component IDs */
/* We default to 2x2 subsamples of chrominance */
jpeg_set_colorspace_SET_COMP(0, 0x01, 2, 2, 0, 0, 0);
jpeg_set_colorspace_SET_COMP(1, 0x22, 1, 1, 1, 1, 1);
jpeg_set_colorspace_SET_COMP(2, 0x23, 1, 1, 1, 1, 1);
break;
default:
ERREXIT(J_MESSAGE_CODE.JERR_BAD_J_COLORSPACE);
break;
}
}