arquivos de imagem RAW de leitura como GDI + bitmaps
Pergunta
Existe uma boa maneira de ler arquivos de imagem RAW (especialmente Canon CR2 e arquivos Adobe DNG) como GDI bitmaps + que é razoavelmente rápido?
Eu encontrei um exemplo em execução no WPF que iria ler uma imagem usando qualquer codec de imagem instalado e, em seguida, exibi-lo em um controle de imagem. E eu modifiquei esse exemplo para criar um GDI + bitmap escrevendo a imagem WPF para um MemoryStream e criar o mapa de bits a partir daí. Mas este processo é lento! Terrivelmente lento! Abrir uma imagem simples leva cerca de 10 segundos no meu computador. Esta solução também requer referências aos conjuntos WPF e que não se sente bem, especialmente desde que eu gostaria de executar o código em um projeto ASP.NET.
Existem programas que vão fazer conversões em lote das imagens, mas eu preferiria converter as imagens dinamicamente quando solicitado.
Então, alguma sugestão?
Solução
Disclaimer:. Eu trabalho em Atalasoft
Nosso DotImage Foto Pro produto pode fazer isso. Se você quiser tentar fazê-lo sozinho, olhar para envolver o opensource DCRaw ou olhada em como Paint.NET faz isso (eu acho que há um plugin RAW para ele)
Outras dicas
O DotImage Foto Pro componente funcionou bem, mas eu tinha um problema ao extrair a imagem de visualização de arquivos raw usando. Ele também está fora do meu orçamento para este projeto.
Mas, eu encontrei o código para um plugin RAW para Paint.NET aqui e foi bastante simples para se adaptar às minhas necessidades. O plugin corre o Process.Start
usign executável DCRaw e lê sua saída do fluxo de StandardOutput
. Bastante simples e rápido! :-)
Editar:
O link para o plugin não funciona mais, mas aqui é o código que usei para extrair as imagens. O código a seguir extrai o jpg-visualização armazenadas no arquivo raw. Se você quiser a imagem completa você deve remover o argumento -e. Mas esteja ciente de que, para algumas câmeras que você vai ter um ppm-imagem que GDI + não pode ler.
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;
}
Além disso, você vai precisar de uma cópia do DCRaw. Eu usei o DcrawMS.exe a partir deste site: http://www.insflug.org/raw/Downloads /
Aqui está uma porta C # de dcraw, ainda que bastante antiga (v8.88), que poderia ser adaptado para incluir novos modelos Canon:
https://sourceforge.net/projects/dcrawnet/
EDIT:
Eu só tenho que trabalhar no meu próprio projeto para a leitura de dados EXIF ??de arquivos RAW:
- Abra as propriedades do projeto e defina Tipo de Saída e Biblioteca de classes .
- Recompile.
- Adicione uma referência para a DLL em seu próprio projeto.
- Adicionar
using dcraw;
no topo. -
Declare estas linhas de código:
DcRawState state = new DcRawState(); state.inFilename = filename; state.ifp = new RawStream(filename); Identifier id = new Identifier(state); id.identify(state.ifp);
Agora confira todas as guloseimas dentro de Estado (assumindo que o seu arquivo RAW é suportado e não causou uma exceção;)
whoa. Apenas tropeçou em este para o meu projeto .NET MVC. Pode fazer RAW, além de qualquer coisa no mundo que você poderia sonhar. Inclui código, exemplos, e muitas opções de linguagem de programação diferentes. Parece tão bom eu me sinto como doar algum dinheiro antes de sequer utilizá-lo.
Google em "imagemagck", uma vez colocar um link não é recomendado. Existe até uma entrada na Wikipedia.
Espero que isso ajude alguém.