JPEGを介したICCプロファイルを使用したカラースペース変換
JPEGフォーマットのカラーマネージメント
この記事では、Aspose.PSD APIを使用してJPEG形式を処理する際にICCプロファイルを使用してカラースペース管理を行う方法について説明します。JPEGの内部カラースペースはYCbCrですが、このフォーマットはグレースケール、RGB、CMYK、およびYCCKカラースペースを画像のメタデータを格納するために使用することもできます。Aspose.PSD APIは主にRGBスペースで動作するため、APIはJPEGファイルを適切に処理するためにカラースペースの変換を行わなければなりません。グレースケールからRGBおよびYCbCrからRGBへの変換は数学的な変換で行うことができますが、CMYKおよびYCCKスペースは簡単にRGBスペースに変換することができません。
Aspose.PSD APIは、CMYKカラースペースを持つJPEG画像に対して直接RGBからCMYKに変換を行わなければならず、一方、YCCKカラースペースを持つ画像はRGBからCMYKからYCCKに変換する必要があります。CMYKからYCCKへの変換は、ITU-R BT.601変換が最初の3つのチャンネルに適用され、Kチャンネルは変更されないようにします。要するに、Aspose.PSD APIは、CMYKおよびYCCK画像の両方に対してRGBとCMYKカラースペースの相互変換を行わなければならず、そのような変換は基本的に色の特性を説明し、色の変換を助ける見出しテーブルであるICCプロフィールの助けを借りて行われます。
ICCプロファイル
ICC変換メカニズムは、ソースのカラースペースをデバイス非依存のCIELABまたはCIEXYZカラースペースにマッピングする「プロファイル」を使用します。Aspose.PSDは、これらの2つのカラースペースを追加プロファイルと共に使用してデータを必要なカラースペースに変換できます。したがって、ICC変換のためには、ユーザーが2つのプロファイルを提供する必要があります。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を.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); | |
} |