如何检查BitmapImage是否为灰度

本文关键字:BitmapImage 是否 灰度 检查 何检查 | 更新日期: 2023-09-27 18:04:35

我从一个StorageFile得到一个BitmapImage:

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

我已经能够通过计算其PixelWidthPixelHeight属性来检查图像是否为正方形。如何检查图像颜色是否为灰度?这篇文章说BitmapPixelFormat属性,不幸的是,Bitmap在UWP中不再可用。

如何检查BitmapImage是否为灰度

可以使用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
}

这取决于你对灰度的定义。

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

但你也可以有不同的想法。

32位ARGB像素格式的图像可以是灰度的吗?假设您扫描每个像素,它们都在灰度线上,如下所示:

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

像素格式允许1600万种组合,但实际上只有256种灰度组合被使用。

根据你自己的习惯,你可能会说这仍然是一个灰度图像,因为它可以转换成灰度图像而不会丢失信息。

如果你没看错,你会看到你的问题的答案,不需要PixelFormat属性存在,但计算起来相当昂贵。