У меня есть файл 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.