Я хочу получить битовую глубину (и цветовое пространство) файла изображения с помощью С #.
Вот мои тестовые файлы. Используя свойства проводника Windows, я проверил их разрядность (8, 16, 24, 48, 96).
BitmapImage.Format.BitsPerPixel
var source = new BitmapImage(new Uri(path));
int bitsPerPixel = source.Format.BitsPerPixel;
Верните 8 для 8-битных оттенков серого и 32 для всех остальных типов.
Image.PixelFormat
Image img = Image.FromFile(path);
string pixelFormat = img.PixelFormat.ToString();
PixelFormat работает для всех, кроме 32-битных изображений с плавающей запятой, где он выдает System.OutOfMemoryException
.
Image.PropertyItems
В этом ответе предлагается свойство PropertyItems.
Работает аналогично приведенному выше примеру, но вызывает исключение для 32-битных изображений.
В этом ответе предлагается использовать код Windows API. Пакет. Но я бы предпочел использовать встроенную функцию C #.
ShellObject so = ShellObject.FromParsingName(filename)
int bitdepth = convert.ToInt32(so.Properties.GetProperty(SystemProperties.System.Image.Bitdepth).ValueAsObject);
Есть ли встроенный метод определения разрядности изображения, который работает с 1, 8, 16, 24, 48, 96 битами?
OutOfMemoryException
, потому что 32-битные растровые изображения с плавающей запятой не поддерживаются GDI + (к сожалению, нехватка памяти - это общий номер ошибки, который выдает GDI). Если вам нужно их поддержать, вам понадобится сторонняя библиотека. - person Luaan   schedule 02.02.2017Bitmap
, а вBitmapSource
. Это совсем другое. - person Luaan   schedule 02.02.2017Bitmap
не знает растровых изображений FP и все. Если вы хотите поддержать их каким-либо образом, вам нужно использовать библиотеку, которая поддерживает. И сноваBitmap
является объектом GDI,BitmapSource
не является - только потому, что вы можете преобразовать данные, не относящиеся к GDI, в растровое изображение GDI, не означает, что GDI поддерживает эти данные. Вы явно проситеBitmapSource
преобразовать в Argb32. - person Luaan   schedule 02.02.2017