Хотя мой ответ приходит с большим опозданием, я надеюсь, что он будет полезен для других людей.
Учитывая ограничения C #, которые ОП определили до сих пор, вот список критериев, которые все еще дают ограниченную свободу программисту с точки зрения форматов пикселей.
- Гибкий битовый дескриптор класса C #, который поддерживает множество форматов пикселей, не являясь универсальным классом C #
- Поскольку универсальный класс на языке C # не дал бы никакой выгоды пользователю обработки изображений.
- Некоторые гарантии безопасности - определенные характеристики объекта дескриптора растрового изображения должны быть неизменными
- В частности, формат пикселя растрового изображения и размеры в пикселях не должны изменяться после создания. Чтобы изменить их, необходимо создать новый объект.
- Предоставляет как изменяемый интерфейс (позволяет изменять значения в пикселях), так и интерфейс неизменяемой объектной модели.
- Чтобы указать любой функции API, что не следует пытаться записать определенный аргумент растрового изображения.
- Набор классов алгоритмов обработки изображений, которые принимают и возвращают класс дескриптора растрового изображения.
- Каждый алгоритм изо всех сил старается обрабатывать различные типы форматов пикселей, насколько это экономически целесообразно.
Принимая во внимание критерии, я бы рекомендовал использовать System.Windows.Media.Imaging в качестве подложки библиотеки, которую вы строите.
Пространство имен System.Windows.Media.Imaging
является аналогом C # библиотеки Microsoft Windows Imaging Component (WIC) . Следовательно, базовая обработка реализована в собственном C ++, что дает ему скорость, необходимую для практического использования.
Благодаря широкой поддержке форматов пикселей, реализованной в WIC, аналог C # также поддерживает тот же диапазон форматов пикселей .
WIC (и System.Windows.Media.Imaging) не предоставляет каких-либо расширенных возможностей обработки изображений (ничего подобного обнаружению краев Канни, преобразованию Хафа, обнаружению объектов и т. Д.)
Однако, с точки зрения интерфейса обмена растровыми объектами в памяти (для интеграции различных библиотек изображений с интерфейсами или привязками C #), оба System.Windows.Media.Imaging.WriteableBitmap
и System.Drawing.Bitmap
подходят.
С точки зрения реализации алгоритмов иногда трудно сделать алгоритмы одинаково применимыми к одноканальным изображениям и многоканальным изображениям. Для этого требуются годы, если не десятилетия, исследований в многомерной математике.
Таким образом, классы алгоритмов обработки изображений обычно фокусируются на поддержке узкого подмножества форматов пикселей:
- 1bpp Black White (для логических / решающих растровых изображений, например, карты границ или членства BLOB-объектов подключенных компонентов)
- 8bpp Grey
- 24bpp BGR
- 32bpp BGRA
- 32bpp Grey Float
- 96bpp BGR Float
- 128bpp BGRA Float
Если класс алгоритма видит дескриптор входного растрового изображения, который не относится к указанному выше типу, он будет стараться изо всех сил «преобразовать» формат ввода в один из вышеуказанных форматов.
Имея в виду это автоматическое преобразование с повышением частоты, пользователь этого класса алгоритма теряет строгий контроль над форматом пикселей растрового изображения , но получает гарантию того, что внешний вид вывода будет соответствовать с ожиданием .