Как запросить битовую глубину PNG?
У меня есть файл PNG с глубиной цвета 8 бит, о чем свидетельствуют свойства файла:
Да, когда я открываю файл
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.