获取 RGB 类型:C# 中的 sRGB 或 Adob​​eRGB?

Getting type of RGB: sRGB or AdobeRGB in C#?

我需要检查我的 WEB 应用程序中的图片是 sRGB 还是 Adob​​e RGB。有没有办法知道图片到底是什么RGB?

更新: 尝试使用 Color.Context,但它始终为 null

代码

Bitmap img = (Bitmap)image;
var imgPixel = img.GetPixel(0,0);
System.Windows.Media.Color colorOfPixel= System.Windows.Media.Color.FromArgb(imgPixel.A,imgPixel.R, imgPixel.G, imgPixel.B);
var context = colorOfPixel.ColorContext; //ColorContext is null

在 System.Windows.Media 中还发现了 PixelFormat 和 PixelFormats,它们可以显示图像的确切 RGB 类型。 但我仍然找不到获取 img 的 System.Windows.Media.PixelFormat 的方法。 我应该怎么做?

Color.ColorContext 属性 MSDN:https://msdn.microsoft.com/en-us/library/System.Windows.Media.Color_properties(v=vs.110).aspx

您需要使用 BitmapDecoder 从那里获取框架,然后检查颜色上下文:

BitmapDecoder bitmapDec = BitmapDecoder.Create(
   new Uri("mybitmap.jpg", UriKind.Relative),
   BitmapCreateOptions.None,
   BitmapCacheOption.Default);
BitmapFrame bmpFrame = bitmapDec.Frames[0];
ColorContext context = bmpFrame.ColorContexts[0];

之后,您需要处理原始颜色配置文件(使用 context.OpenProfileStream())以确定它是哪个配置文件。

如果您想将配置文件写入磁盘以使用十六进制编辑器或其他工具检查它们,您可以使用此代码:

using(var fileStream = File.Create(@"myprofilename.icc"))
using (var st = context.OpenProfileStream())
{
  st.CopyTo(fileStream);
  fileStream.Flush(true);
  fileStream.Close();
}

使用该方法,如果您想检查它们,我已经从两个 sRGB (link) and AdobeRGB (link) 中提取了原始数据。如果您想检查,开头有魔术字符串和 ID,但我真的不知道它们或不知道在哪里可以找到常见的 table(嵌入的配置文件可以是无限的,不限于 Adob​​eRGB 和sRGB).

此外,一张图片可能有不止一种颜色配置文件。

使用此方法,如果 ColorContexts 为空,则图像没有任何配置文件。

您可能会使用 System.Drawing.Image.PropertyItems。 属性 "PropertyTagICCProfile" (Id=34675=0x8773) 填充了图像的 icc 配置文件,即使它嵌入在图像数据中而不是在 exif 数据中(或者没有嵌入配置文件,但是该图像在 exif 中被标记为 Adob​​eRGB:InteroperabilityIndex="R03").

byte[] iccProfile = null;
try {
    System.Drawing.Bitmap myImage = new Bitmap("Image.jpg");
    iccProfile = myImage.GetPropertyItem(34675).Value;
} catch (Exception) {
    //...
}