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