Чтение файлов изображений RAW в виде растровых изображений GDI+
Вопрос
Есть ли хороший способ достаточно быстрого чтения файлов изображений RAW (особенно файлов Canon CR2 и Adobe DNG) в виде растровых изображений GDI+?
Я нашел пример, работающий под WPF, который считывал изображение с помощью любого установленного кодека изображения, а затем отображал его в элементе управления изображением.И я изменил этот пример, чтобы создать растровое изображение GDI+, записав изображение WPF в MemoryStream и создав из него растровое изображение.Но этот процесс медленный!Ужасно медленно!Открытие простого изображения на моем компьютере занимает около 10 секунд.Это решение также требует ссылок на сборки WPF, и это неправильно, особенно потому, что я хотел бы запустить код в проекте ASP.NET.
Существуют программы, которые выполняют пакетное преобразование изображений, но я бы предпочел конвертировать изображения динамически по запросу.
Итак, есть предложения?
Решение
Отказ от ответственности: я работаю в Atalasoft.
Наш продукт DotImage Photo Pro может это сделать. Если вы хотите попробовать сделать это самостоятельно, посмотрите на оболочку DCRaw с открытым исходным кодом или посмотрите, как это делает Paint.NET (я думаю, что для этого есть плагин RAW)
Другие советы
Компонент DotImage Photo Pro работал хорошо, но у меня возникла проблема с извлечением изображения предварительного просмотра из необработанных файлов с его помощью.Это также выходит за рамки моего бюджета на этот проект.
Но я нашел код плагина RAW для Paint.NET. здесь и было довольно просто адаптироваться к моим потребностям.Плагин запускает исполняемый файл DCRaw. Process.Start
и считывает его вывод из StandardOutput
транслировать.Довольно просто и быстро!:-)
Редактировать:
Ссылка на плагин больше не работает, но вот код, который я использовал для извлечения изображений.Следующий код извлекает превью jpg, хранящееся в необработанном файле.Если вам нужно полное изображение, вам следует удалить аргумент -e.Но имейте в виду, что для некоторых камер вы получите изображение в формате ppm, которое GDI+ не сможет прочитать.
public Stream GetImageData(string inputFile, string dcRawExe)
{
var startInfo = new ProcessStartInfo(dcRawExe)
{
Arguments = "-c -e \"" + inputFile + "\"",
RedirectStandardOutput = true,
UseShellExecute = false
};
var process = Process.Start(startInfo);
var image = Image.FromStream(process.StandardOutput.BaseStream);
var memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Png);
return memoryStream;
}
Также вам понадобится копия DCRaw.Я использовал DcrawMS.exe с этого сайта: http://www.insflug.org/raw/Downloads/
Вот порт Cc dcraw, хотя и довольно старый (v8.88), который можно адаптировать для включения более новых моделей Canon:
https://sourceforge.net/projects/dcrawnet/
РЕДАКТИРОВАТЬ:
Я просто заставил его работать в моем собственном проекте для чтения EXIF-данных из файлов RAW:
, используя dcraw;
вверху. Объявите эти строки кода:
DcRawState state = new DcRawState();
state.inFilename = filename;
state.ifp = new RawStream(filename);
Identifier id = new Identifier(state);
id.identify(state.ifp);
Теперь проверьте все вкусности внутри состояния (при условии, что ваш файл RAW поддерживается и не вызывает исключений;)
эй.Просто наткнулся на это для своего проекта .NET MVC.Может работать в формате RAW, а также во всем, о чем вы только можете мечтать.Включает код, примеры и множество различных языков программирования.Выглядит так хорошо, что мне хочется пожертвовать немного денег, прежде чем использовать его.
Погуглите по "imagemagck", так как ссылку ставить не рекомендуется.Есть даже запись в Википедии.
Я надеюсь, что это помогает кому-то.