Есть ли хороший способ чтения файлов изображений RAW (особенно файлов Canon CR2 и Adobe DNG) как растровых изображений GDI +, который является достаточно быстрым?
Я нашел пример, работающий под WPF, который считывал бы изображение с использованием любого установленного кодека изображения, а затем отображал бы его в элементе управления изображением. И я изменил этот пример, чтобы создать растровое изображение GDI +, записав изображение WPF в MemoryStream и создав из него Bitmap. Но этот процесс идет медленно! Ужасно медленно! Открытие простого изображения на моем компьютере занимает около 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/
Считывает / может ли это тоже читать данные EXIF?
Нет, но есть другие инструменты командной строки, которые извлекают файл exif. Попробуйте погуглить по запросу "dcraw exif"
Сайт, на который вы указали, не работает. Есть ли шанс разместить здесь код, чтобы помочь другим ищущим? :)
Для приложений Windows Forms можем ли мы вернуть Image.FromStream... напрямую (без копирования на MemoryStream)?
Нет, я так не думаю. Мы используем MemoryStream, чтобы получить копию изображения, которое мы можем использовать в другом месте.
Вот порт C# для dcraw, хотя и довольно старый (v8.88), который можно адаптировать для включения более новых моделей Canon:
https://sourceforge.net/projects/dcrawnet/
РЕДАКТИРОВАТЬ :
Я только что заставил его работать в моем собственном проекте для чтения данных EXIF из файлов RAW:
using dcraw; вверху.Объявите эти строки кода:
DcRawState state = new DcRawState();
state.inFilename = filename;
state.ifp = new RawStream(filename);
Identifier id = new Identifier(state);
id.identify(state.ifp);
Теперь проверьте все полезности внутри состояние (при условии, что ваш файл RAW поддерживается и не вызывает исключения;)
DCraw: cybercom.net/~dcoffin/dcraw