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

2

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

Btw: Я не хочу использовать внешние библиотеки, если это возможно. Но если вы знаете, что класс утилиты с открытым исходным кодом выполняет наиболее распространенные задачи обработки изображений, я был бы рад услышать об этом. Спасибо заранее.

Теги:
rgb
graphics
color-space

4 ответа

2
Лучший ответ

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

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

Проанализируйте поля. Идентификатор, который вы ищете, - 0xFF 0xC0. Это называется SOF0 и содержит высоту, ширину, глубину бита и т.д. 0xFF 0xC0 будет сопровождаться двумя байтами для длины поля. Сразу же после этого будет один байт, показывающий глубину бита, который обычно будет 8. Тогда будет два байта для высоты, два для ширины и один байт для количества компонентов; обычно это будет 1 (для оттенков серого) или 3. (для цвета)

0

Стандартное пространство имен .NET System.Drawing должно иметь все, что вам нужно, но это, вероятно, будет не очень эффективным. Он загрузит все это в ОЗУ, распакует его, преобразует (возможно, делая копию), а затем повторно сжимает и сохраняет его. Если вы нацелены на высокую производительность, я боюсь, что вам, возможно, придется заглянуть в библиотеки C/С++ и сделать для них .NET-обертки.

0

Насколько я знаю, jpg всегда 24 bpp. Единственное, что может измениться, - это CMY (K?), А не RGB. Эта информация будет храниться в заголовке. К сожалению, у меня нет никаких средств для создания изображения CMYK, чтобы проверить, будет ли загрузка в Bitmap автоматически конвертировать его.

Следующая строка будет считывать файл в памяти:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat сообщит вам формат изображения. Однако я не могу проверить, что загружает файл с файлами, отличными от 24bpp RGB jpg. Я могу только рекомендовать вам попробовать.

  • 0
    Я полагаю, что JPG может иметь глубину 24 и 8 бит, что тогда является изображением в градациях серого.
  • 0
    Ах - я не помню о 8-битной глубине, но я должен был сделать это, поскольку мне приходилось иметь дело с текстурными изображениями во всех видах форматов в предыдущей работе. Опять же, не будет ли загрузка растровых изображений из файла выполнять преобразование для вас?
Показать ещё 1 комментарий
0

Это не то, что я пробовал сам, но я думаю, вам может понадобиться получить информацию EXIF-изображения в начале.

Зайдите в блог-запись Скотта Ханзельмана при доступе к информации EXIF ​​из изображений.

  • 1
    Exif-Data - это просто необязательные метаданные, связанные с изображением. Изменение Exif-Data ничего не меняет на изображении. Но все равно спасибо за ваш ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню