2016-08-28 37 views
0

我有一个BitmapImageStorageFile如何检查BitmapImage是灰度?

using (var stream = await file.OpenAsync(FileAccessMode.Read)) { 
    var bitmap = new BitmapImage(); 
    await bitmap.SetSourceAsync(stream); 
} 

我已经能够检查,如果图像是通过计算其PixelWidthPixelHeight性广场。如何检查图像颜色是否灰度? This postBitmap有一个PixelFormat财产,不幸的是,Bitmap已不再在UWP中可用。

+0

一般来说,对于灰度图像唯一唯一的是它使用相当平淡的颜色。像素的红色,绿色和蓝色值大致相同。有一些特定于灰度的图像格式,但现在很少使用,显示它们的硬件几乎完全消失。这引发了你为什么关心它的问题。 –

回答

1

这取决于您的灰度定义。

您可能认为灰度是像素格式的问题。在这种情况下,你必须在UWP中找到PixelFormat的替代品,如果它存在的话(我真的不知道)。

但是,你也可能有不同的想法。

32位ARGB像素格式的图像可以是灰度图吗?假设你扫描每个像素和他们都在灰阶线,像这样:

0x000000 
0x010101 
0x020202 
... 
0xfefefe 
0xffffff 

像素格式允许1600万个组合,但只有256分灰度的人被实际使用。

按照您自己的约定,您可能会说这仍然是灰度图像,因为它可以转换为一个而不会丢失信息。

如果您正确地阅读了我,您会看到一个问题的答案,它不需要PixelFormat属性存在,但计算起来相当昂贵。

2

您可以使用BitmapDecoder来获取BitmapPixelFormat的值。像这样使用它

using (var stream = await file.OpenAsync(FileAccessMode.Read)) { 
    var bitmap = new BitmapImage(); 
    await bitmap.SetSourceAsync(stream); 

    var decoder = await BitmapDecoder.CreateAsync(stream); 
    BitmapPixelFormat format = decoder.BitmapPixelFormat; 

    if(format == BitmapPixelFormat.Gray16 || format == BitmapPixelFormat.Gray8) 
     // Bitmap is grayscale 
}