Как прочитать и изменить цветовое пространство изображения на c#

StackOverflow https://stackoverflow.com/questions/1086472

  •  23-08-2019
  •  | 
  •  

Вопрос

Я загружаю растровое изображение из файла jpg.Если изображение не 24-битное RGB, я бы хотел его преобразовать.Преобразование должно быть довольно быстрым.Изображения, которые я загружаю, достигают огромных размеров (9000 * 9000 пикселей при сжатом размере 40-50 МБ).Как это можно сделать?

Кстати:Я не хочу использовать какие-либо внешние библиотеки, если это возможно.Но если вы знаете о служебном классе с открытым исходным кодом, выполняющем наиболее распространенные задачи обработки изображений, я был бы рад услышать о нем.Заранее благодарю.

Это было полезно?

Решение

Файл jpeg должен начинаться с 0xFF 0xD8.После этого вы найдете различные поля в формате:

  1. Идентификатор поля 2 байта
  2. Длина поля, исключая идентификатор поля.2 байта.
  3. Переменные данные.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top