Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取RGB的类型:C#中的sRGB或AdobeRGB?_C#_Image_Web_Rgb_Srgb - Fatal编程技术网

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

获取RGB的类型:C#中的sRGB或AdobeRGB?,c#,image,web,rgb,srgb,C#,Image,Web,Rgb,Srgb,我需要检查我的Web应用程序中的图片是sRGB还是Adobe RGB。有没有办法知道图片的RGB是什么 更新: 尝试使用Color.Context,但始终为空 代码 在System.Windows.Media中还可以找到PixelFormat和PixelFormat,它们可以显示图像的确切RGB类型。 但我仍然找不到一种方法来获取img的System.Windows.Media.pixel格式。 如何执行此操作?Color.ColorContext属性 MSDN:您需要使用位图解码器从那里获取帧

我需要检查我的Web应用程序中的图片是sRGB还是Adobe RGB。有没有办法知道图片的RGB是什么

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

代码

在System.Windows.Media中还可以找到PixelFormat和PixelFormat,它们可以显示图像的确切RGB类型。 但我仍然找不到一种方法来获取img的System.Windows.Media.pixel格式。
如何执行此操作?

Color.ColorContext属性
MSDN:

您需要使用
位图解码器
从那里获取帧,然后检查颜色上下文:

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()和AdobeRGB()中提取了原始数据,如果您想检查它们的话。如果你想检查的话,在开始的时候有一些神奇的字符串和ID,但我真的不知道它们,也不知道在哪里可以找到一个用于普通字符串的表(嵌入的配置文件可以是无限的,不限于AdobeRGB和sRGB)

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


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

您可以使用
System.Drawing.image.PropertyItems
。属性“PropertyAgicProfile”(Id=34675=0x8773)由映像的icc配置文件填充,即使它嵌入到映像数据中而不是exif数据中(或者没有嵌入配置文件,但映像在exif:InteroperabilityIndex=“R03”中标记为AdobeRGB)


ColorContext
null
,因为您是通过指定组件以语法方式创建颜色的。要使用它,您需要使用
BitmapFrame
,它具有
ColorContexts
属性(您将在索引0中找到正确的属性)。我现在真的不能写一个例子。我做了这个BitmapSource bmp=new BitmapImage(uri);BitmapFrame bmf=BitmapFrame.Create(bmp);ColorContexts为空(Format属性始终为bgr32,尽管我通过在线转换器转换为sRGB和adobe RGB,并检查了boss给我的照片作为示例使用此答案。ColorContexts[0]。colorspace始终为RGB:我编写了一个如何获取颜色上下文的示例(并对其进行了测试)。如果原始图像的颜色配置文件不同于sRGB,则位图解码器必须与选项
BitmapCreateOptions.PreservePixelFormat
BitmapCacheOption.None
一起使用。确定该上下文是sRGB还是AdobeRGB可能需要更多的工作,否则颜色转换无法正常工作。
using(var fileStream = File.Create(@"myprofilename.icc"))
using (var st = context.OpenProfileStream())
{
  st.CopyTo(fileStream);
  fileStream.Flush(true);
  fileStream.Close();
}
byte[] iccProfile = null;
try {
    System.Drawing.Bitmap myImage = new Bitmap("Image.jpg");
    iccProfile = myImage.GetPropertyItem(34675).Value;
} catch (Exception) {
    //...
}