使用 ICC 配置文件为 JPEG 进行颜色空间转换
JPEG 格式的颜色管理
本文讨论了在处理 JPEG 格式时如何使用 ICC 配置文件执行颜色空间管理,Aspose.PSD API。JPEG 的内部颜色空间是 YCbCr,然而这种 格式 也可以容纳灰度、RGB、CMYK 和 YCCK 颜色空间以存储图像的元数据。Aspose.PSD API 主要在 RGB 空间中运行,因此 API 必须执行颜色空间转换,以便正确处理 JPEG 文件。灰度到 RGB 和 YCbCr 到 RGB 的转换可以通过数学转换完成,但是 CMYK 和 YCCK 空间不能轻松转换为 RGB 空间。
Aspose.PSD API 必须执行直接的 RGB 到 CMYK 颜色转换,用于具有 CMYK 颜色空间的 JPEG 图像。另一方面,具有 YCCK 颜色空间的图像需要执行 RGB 到 CMYK 到 YCCK 颜色转换,其中 CMYK 到 YCCK 转换使用 ITU-R BT.601 转换应用于前三个通道,保持 k 通道不变。简而言之,Aspose.PSD API 必须对 CMYK 和 YCCK 图像的 RGB 和 CMYK 颜色空间进行互换,并且这样的转换是通过 ICC Profiles 进行的,这些 ICC Profiles 基本上是描述颜色属性并帮助进行颜色转换的查找表。
ICC 配置文件
ICC 转换机制使用"配置文件",将源颜色空间映射到设备独立的 CIELAB 或 CIEXYZ 颜色空间。Aspose.PSD 可以根据需要将数据转换为这两种具有附加配置文件的颜色空间。因此,对于 ICC 转换,用户需要提供两个配置文件 - 一个 RGB 配置文件用于获得内部 CIE 颜色空间,另一个 CMYK 配置文件用于获得 CMYK 颜色特征。为了实现 CMYK 到 RGB 的转换,需要交换配置文件,即; 使用 CMYK 配置文件作为源配置文件并使用 RGB 配置文件作为目标配置文件。
通过 ICC 配置文件为 JPEG 进行颜色转换
Aspose.PSD API 隐藏了细节,提供了一种易于使用的机制,通过 JpegOptions 类来指定 ICC 配置文件。此外,Aspose.PSD 使用 SWOP、CMYK 和 sRGB 的示例配置文件嵌入到其核心中,因此在大多数常见用例中,用户不需要寻找任何特定的配置文件。这样的校正有一个缺点,即;这样的颜色空间转换是不可逆的,因为我们不能期望在 RGB 到 CMYK 到 RGB 转换后得到相同的颜色,因为不兼容的颜色空间和不同的颜色配置文件。以下代码片段演示了使用 Aspose.PSD for .NET API 指定 YCCK JPEG 图像的 RGB 和 CMYK 配置文件。在下面的示例中,RGB 和 CMYK 配置文件被更改,并且图像被保存到 YCCK 颜色空间。请注意,这些 RgbColorProfile 和 CmykColorProfile 属性将用于更改 YCCK 颜色空间的像素数据。所有其他颜色空间不能获取用于更新颜色数据的色彩配置文件。
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// Create a new Image. | |
using (PsdImage image = new PsdImage(500, 500)) | |
{ | |
// Fill image data. | |
int count = image.Width * image.Height; | |
int[] pixels = new int[count]; | |
int r = 0; | |
int g = 0; | |
int b = 0; | |
int channel = 0; | |
for (int i = 0; i < count; i++) | |
{ | |
if (channel % 3 == 0) | |
{ | |
r++; | |
if (r == 256) | |
{ | |
r = 0; | |
channel++; | |
} | |
} | |
else if (channel % 3 == 1) | |
{ | |
g++; | |
if (g == 256) | |
{ | |
g = 0; | |
channel++; | |
} | |
} | |
else | |
{ | |
b++; | |
if (b == 256) | |
{ | |
b = 0; | |
channel++; | |
} | |
} | |
pixels[i] = Color.FromArgb(r, g, b).ToArgb(); | |
} | |
// Save the newly created pixels. | |
image.SaveArgb32Pixels(image.Bounds, pixels); | |
// Save the resultant image with default Icc profiles. | |
image.Save(dataDir + "Default_profiles.jpg", new JpegOptions()); | |
// Update color profile. | |
StreamSource rgbprofile = new StreamSource(File.OpenRead(dataDir + "eciRGB_v2.icc")); | |
StreamSource cmykprofile = new StreamSource(File.OpenRead(dataDir + "ISOcoated_v2_FullGamut4.icc")); | |
image.RgbColorProfile = rgbprofile; | |
image.CmykColorProfile = cmykprofile; | |
// Save the resultant image with new YCCK profiles. You will notice differences in color values if compare the images. | |
JpegOptions options = new JpegOptions(); | |
options.ColorType = JpegCompressionColorMode.Ycck; | |
image.Save(dataDir + "Ycck_profiles.jpg", options); | |
} |
如果未设置任何配置文件,则 Aspose.PSD for .NET API 将使用默认配置文件。下面的示例使用目标配置文件属性来更改大多数 JPEG 图像的目标颜色空间。
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// Create a new Image. | |
using (PsdImage image = new PsdImage(500, 500)) | |
{ | |
// Fill image data. | |
int count = image.Width * image.Height; | |
int[] pixels = new int[count]; | |
int r = 0; | |
int g = 0; | |
int b = 0; | |
int channel = 0; | |
for (int i = 0; i < count; i++) | |
{ | |
if (channel % 3 == 0) | |
{ | |
r++; | |
if (r == 256) | |
{ | |
r = 0; | |
channel++; | |
} | |
} | |
else if (channel % 3 == 1) | |
{ | |
g++; | |
if (g == 256) | |
{ | |
g = 0; | |
channel++; | |
} | |
} | |
else | |
{ | |
b++; | |
if (b == 256) | |
{ | |
b = 0; | |
channel++; | |
} | |
} | |
pixels[i] = Color.FromArgb(r, g, b).ToArgb(); | |
} | |
// Save the newly created pixels. | |
image.SaveArgb32Pixels(image.Bounds, pixels); | |
// Save the newly created image. | |
image.Save(dataDir + "Default.jpg", new JpegOptions()); | |
// Update color profile. | |
StreamSource rgbprofile = new StreamSource(File.OpenRead(dataDir + "eciRGB_v2.icc")); | |
StreamSource cmykprofile = new StreamSource(File.OpenRead(dataDir + "ISOcoated_v2_FullGamut4.icc")); | |
image.RgbColorProfile = rgbprofile; | |
image.CmykColorProfile = cmykprofile; | |
// Save the resultant image with new YCCK profiles. You will notice differences in color values if compare the images. | |
JpegOptions options = new JpegOptions(); | |
options.ColorType = JpegCompressionColorMode.Cmyk; | |
image.Save(dataDir + "Cmyk_Default_profiles.jpg", options); | |
} |