Domanda

Esiste un buon modo per leggere i file di immagine RAW (in particolare i file Canon CR2 e Adobe DNG) come bitmap GDI + che è ragionevolmente veloce?

Ho trovato un esempio in esecuzione su WPF che leggeva un'immagine usando qualsiasi codec di immagine installato e poi lo visualizzava in un controllo immagine. E ho modificato questo esempio per creare una bitmap GDI + scrivendo l'immagine WPF su MemoryStream e creando la bitmap da quella. Ma questo processo è lento! Orribilmente lento! L'apertura di una semplice immagine richiede circa 10 secondi sul mio computer. Questa soluzione richiede anche riferimenti agli assembly WPF e questo non sembra corretto, soprattutto perché non vorrei eseguire il codice in un progetto ASP.NET.

Esistono programmi che eseguiranno conversioni batch delle immagini, ma preferirei convertire le immagini in modo dinamico quando richiesto.

Quindi, qualche suggerimento?

È stato utile?

Soluzione

Dichiarazione di non responsabilità: lavoro ad Atalasoft.

Il nostro DotImage Photo Pro può farlo. Se vuoi provare a farlo da solo, guarda nel wrapping di opensource DCRaw o guarda come lo fa Paint.NET (penso che ci sia un plugin RAW per esso)

Altri suggerimenti

Il componente DotImage Photo Pro ha funzionato bene, ma ho riscontrato un problema nell'estrazione dell'immagine di anteprima dai file non elaborati. È anche al di fuori del mio budget per questo progetto.

Ma ho trovato il codice per un plugin RAW per Paint.NET qui ed è stato abbastanza semplice adattarsi alle mie esigenze. Il plugin esegue l'eseguibile DCRaw usign Process.Start e legge il suo output dal flusso StandardOutput . Abbastanza semplice e veloce! :-)

Modifica:

Il link al plugin non funziona più, ma ecco il codice che ho usato per estrarre le immagini. Il codice seguente estrae l'anteprima jpg memorizzata nel file raw. Se si desidera l'immagine completa, è necessario rimuovere l'argomento -e. Ma tieni presente che per alcune fotocamere otterrai un'immagine ppm che GDI + non è in grado di leggere.

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;
}

Inoltre, avrai bisogno di una copia di DCRaw. Ho utilizzato DcrawMS.exe da questo sito: http://www.insflug.org/raw/Downloads /

Ecco una porta C # di dcraw, anche se piuttosto vecchia (v8.88) che potrebbe essere adattata per includere i nuovi modelli Canon:
https://sourceforge.net/projects/dcrawnet/

MODIFICA:
Ho appena funzionato nel mio progetto per la lettura dei dati EXIF ??dai file RAW:

  1. Apri le proprietà del progetto e imposta Tipo di output su Libreria di classi .
  2. ricompilazione.
  3. Aggiungi un riferimento alla DLL nel tuo progetto.
  4. Aggiungi usando dcraw; in alto.
  5. Dichiara queste righe di codice:

    DcRawState state = new DcRawState();
    state.inFilename = filename;
    state.ifp = new RawStream(filename);
    
    
    Identifier id = new Identifier(state);
    id.identify(state.ifp);
    

Ora controlla tutte le chicche all'interno di stato (supponendo che il tuo file RAW sia supportato e non abbia causato un'eccezione;)

Whoa. Mi sono appena imbattuto in questo per il mio progetto .NET MVC. Puoi fare RAW, oltre a qualsiasi cosa al mondo che potresti sognare. Include codice, esempi e molte diverse scelte del linguaggio di programmazione. Sembra così bello che mi sento di donare un po 'di denaro prima ancora di usarlo.

Google su " imagemagck " poiché non è consigliabile inserire un collegamento. C'è anche una voce di Wikipedia.

Spero che questo aiuti qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top