Как запросить битовую глубину PNG? - PullRequest
2 голосов
/ 04 мая 2019

У меня есть файл PNG с глубиной цвета 8 бит, о чем свидетельствуют свойства файла:

enter image description here

Да, когда я открываю файл

var filePath = "00050-w600.png";
var bitmap = new Bitmap(filePath);
Console.WriteLine(bitmap.PixelFormat);

Я получаю Format32bppArgb.Я также посмотрел в свойствах PropertyIdList и PropertyItems, но не увидел ничего очевидного.

Так как мне извлечь битовую глубину из PNG?

PS Ни один из фреймворковметоды, кажется, работают.System.Windows.Media.Imaging.BitmapSource может работать, но это только в WPF и .NET Core 3. Мне это нужно для .NET 4.x и .NET Core 2.x.

PPS Мне просто нужно было знать, равен ли PNG 8немного или нет, поэтому я написал верный метод огня, чтобы проверить, нужен ли он кому-то - должен работать в любой среде.

public static bool IsPng8BitColorDepth(string filePath)
{
    const int COLOR_TYPE_BITS_8 = 3;
    const int COLOR_DEPTH_8 = 8;
    int startReadPosition = 24;
    int colorDepthPositionOffset = 0;
    int colorTypePositionOffset = 1;

    try
    {
        using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            fs.Position = startReadPosition; 

            byte[] buffer = new byte[2];
            fs.Read(buffer, 0, 2);

            int colorDepthValue = buffer[colorDepthPositionOffset];
            int colorTypeValue = buffer[colorTypePositionOffset];

            return colorDepthValue == COLOR_DEPTH_8 && colorTypeValue == COLOR_TYPE_BITS_8;
        }
    } 
    catch (Exception)
    {
        return false;
    }
}

   Color   Allowed       Interpretation
   Type    Bit Depths

   0       1,2,4,8,16    Each pixel value is a grayscale level.

   2       8,16          Each pixel value is an R,G,B series.

   3       1,2,4,8       Each pixel value is a palette index;
                         a PLTE chunk must appear.

   4       8,16          Each pixel value is a grayscale level,
                         followed by an alpha channel level.

   6       8,16          Each pixel value is an R,G,B series,
                         followed by an alpha channel level.
...