Получить глубину цвета растрового изображения

Я хочу получить битовую глубину (и цветовое пространство) файла изображения с помощью С #.

Вот мои тестовые файлы. Используя свойства проводника 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 битами?


person Leander    schedule 02.02.2017    source источник
comment
Он выдает OutOfMemoryException, потому что 32-битные растровые изображения с плавающей запятой не поддерживаются GDI + (к сожалению, нехватка памяти - это общий номер ошибки, который выдает GDI). Если вам нужно их поддержать, вам понадобится сторонняя библиотека.   -  person Luaan    schedule 02.02.2017
comment
@Luaan Означает ли это, что 32-битные версии не поддерживаются полностью? Поскольку их можно преобразовать в растровое изображение, см. Мой первый вопрос: stackoverflow.com/a/42000617/6879283   -  person Leander    schedule 02.02.2017
comment
Это не преобразование в Bitmap, а в BitmapSource. Это совсем другое.   -  person Luaan    schedule 02.02.2017
comment
Конвертировано / декодировано, но не сохранено в 32-битном flp .. Кстати, ссылка на ваш тестовый файл не работает   -  person TaW    schedule 02.02.2017
comment
@Luaan Я думал, что смогу преобразовать это в объект Bitmap. stackoverflow.com/a/2897325/6879283 Я также понимаю, что теряю информацию. Я бы предпочел определить битовую глубину, а затем импортировать 32-битное изображение по-другому, чем перехватывать исключение, потому что это может быть вызвано фактической нехваткой памяти. Даже если я просто хотел отобразить ошибку: 32-разрядный. Не поддерживается, я должен выяснить, является ли файл 32-разрядным изображением, верно?   -  person Leander    schedule 02.02.2017
comment
Обычно это невозможно с пространством имен System.Drawing. Кодеки, включенные в .NET, были разработаны для создания растровых изображений в памяти, которые легко и быстро обрабатываются и отображаются, они будут преобразованы из формата пикселей в файл, если это необходимо для достижения этой цели. Для этого вам понадобится библиотека, довольно сложная покупка, если вы этого хотите. Lead Tools - это горилла за тысячу фунтов.   -  person Hans Passant    schedule 02.02.2017
comment
При разборе файла изображения возникает много догадок. Как отличить растровое изображение без заголовка, которое слишком велико для размещения в памяти, и файл, который вообще не является растровым изображением? Я видел гораздо больше таких в дикой природе, чем растровые изображения FP. Bitmap не знает растровых изображений FP и все. Если вы хотите поддержать их каким-либо образом, вам нужно использовать библиотеку, которая поддерживает. И снова Bitmap является объектом GDI, BitmapSource не является - только потому, что вы можете преобразовать данные, не относящиеся к GDI, в растровое изображение GDI, не означает, что GDI поддерживает эти данные. Вы явно просите BitmapSource преобразовать в Argb32.   -  person Luaan    schedule 02.02.2017