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?

Foi útil?

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:

  1. Abra as propriedades do projeto e defina Tipo de Saída e Biblioteca de classes .
  2. Recompile.
  3. Adicione uma referência para a DLL em seu próprio projeto.
  4. Adicionar using dcraw; no topo.
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top