在C#中获取RGB类型:sRGB或AdobeRGB?

时间:2015-02-26 03:14:41

标签: c# image web rgb srgb

我需要检查WEB应用程序中的图片是sRGB还是Adobe 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的方法。 我该怎么做?

3 个答案:

答案 0 :(得分:3)

您需要使用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)和AdobeRGB(link)中提取原始数据。如果你想检查,那么一开始就有神奇的字符串和ID,但我真的不知道它们或知道在哪里找到常见的表格(嵌入的配置文件可以是无限的,不限于AdobeRGB和sRGB)

此外,一张图片可能有多个颜色配置文件。

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

答案 1 :(得分:1)

答案 2 :(得分:0)

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

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