Как прочитать и изменить цветовое пространство изображения на c#
-
23-08-2019 - |
Вопрос
Я загружаю растровое изображение из файла jpg.Если изображение не 24-битное RGB, я бы хотел его преобразовать.Преобразование должно быть довольно быстрым.Изображения, которые я загружаю, достигают огромных размеров (9000 * 9000 пикселей при сжатом размере 40-50 МБ).Как это можно сделать?
Кстати:Я не хочу использовать какие-либо внешние библиотеки, если это возможно.Но если вы знаете о служебном классе с открытым исходным кодом, выполняющем наиболее распространенные задачи обработки изображений, я был бы рад услышать о нем.Заранее благодарю.
Решение
Файл jpeg должен начинаться с 0xFF 0xD8.После этого вы найдете различные поля в формате:
- Идентификатор поля 2 байта
- Длина поля, исключая идентификатор поля.2 байта.
- Переменные данные.
Выполните синтаксический анализ по полям.Идентификатор, который вы будете искать, равен 0xFF 0xC0.Это называется SOF0 и содержит высоту, ширину, разрядность и т.д.За 0xFF 0xC0 будет следовать два байта для длины поля.Сразу за этим будет один байт, показывающий разрядность, которая обычно равна 8.Тогда будет два байта для высоты, два для ширины и один байт для количества компонентов;обычно это значение равно 1 (для оттенков серого) или 3.(для цвета)
Другие советы
Это не то, что я пробовал сам, но я думаю, вам, возможно, потребуется для начала получить доступ к информации EXIF на картинке.
Ознакомьтесь с записью в блоге Скотта Хансельмана о доступе к информации EXIF из изображений.
Стандартный .NET System.Drawing
пространство имен должно содержать все, что вам нужно,
но это, вероятно, будет не очень эффективно.Он загрузит все это в оперативную память, распакует, преобразует (возможно, создав копию), а затем повторно сожмет и сохранит.Если вы стремитесь к высокой производительности, боюсь, вам может понадобиться заглянуть в библиотеки C / C ++ и создать .СЕТЕВЫЕ оболочки для них.
Насколько я знаю, jpg всегда равен 24 битам в секунду.Единственное, что могло бы измениться, это то, что это CMY (K?), а не RGB.Эта информация будет сохранена в заголовке.К сожалению, у меня нет никаких средств создания изображения CMYK, чтобы проверить, преобразует ли загрузка в растровое изображение его автоматически.
Следующая строка будет считывать файл в память:
Bitmap image = Image.FromFile(fileName);
image.PixelFormat
сообщит вам формат изображения.Тем не менее, я не могу проверить, что делает загрузка файла с файлами, отличными от 24bpp RGB JPG.Я могу только порекомендовать вам попробовать это.