2010-08-20 7 views
6

Devo ammettere che non ho mai capito di cosa si tratta? Ho sempre pensato che fosse una cosa di internet. Ma ora mi imbatto in un codice che utilizza un flusso per caricare un file localy e mi chiedo se non v'è vantaggio per l'utilizzo di un flusso di sopra ... bene il modo in cui ho sempre i file caricati:Caricamento di un file immagine Image.FromFile VS FileStream

private void loadingfromStream() 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo("c:/"); 
    FileInfo[] fileInfoArr = dirInfo.GetFiles(); 
    FileInfo fileInfo = fileInfoArr[0];  

    // creating a bitmap from a stream 
    FileStream fileStream = fileInfo.OpenRead();    
    Bitmap bitmap = new Bitmap(fileStream); 
    Image currentPicture = (Image)bitmap  
} 

vs.

private void loadingUsingImageClass 
{  
    Image currentPicture = Image.FromFile(originalPath); 
} 

risposta

15

Se conosce il codice verrà caricando i dati da un file, utilizzare Image.FromFile - è, ovviamente, il codice piuttosto semplice, ed è possibile che ci sono ottimizzazioni nel quadro quando è si tratta di file.

L'utilizzo di uno stream è più flessibile, ma a meno che non sia necessario il tale flessibilità, andare con la soluzione di file.

+0

Quale metodo è migliore quando ho bisogno che la mia immagine sia accessibile da più punti contemporaneamente ?. Come mostrare l'immagine in 3 posti contemporaneamente e anche modificare. – iamCR

+0

@SanthoshKumar: È difficile rispondere senza ulteriori informazioni, che dovrebbero essere in una domanda diversa. Mi aspetto che 'Image.FromFile' sia a posto. –

2

Come un'aggiunta alla Jon's risposta:

Per quanto vedo, i due metodi non fanno la stessa cosa sia. Il primo ti dà la prima immagine in "C:\" dove il secondo ti regala un'immagine da un percorso. Quindi la complessità aggiunta nel primo non è solo perché sta usando i flussi.

Questo sarebbe equivalente:

using (var fs = File.OpenRead(path)) 
using (var img = Image.FromStream(fs)) 
{ 
    //... 
} 

e in tal caso, è certamente meglio di fare proprio con Image.FromFile come spiegato Jon.

3

Se si desidera gestire i file di immagine, ovviamente la seconda soluzione è migliore. Nella tua prima sezione, hai Bitmap bitmap = new Bitmap(fileStream); sai che un file immagine non è sempre Bitmap, può anche essere JPEG/PNG/TIFF e così via. Mentre Image.FromFile è piuttosto professionale per gestire file di immagini con estensioni diverse.

In generale, FileStream è comune a problemi di file, mentre Image.FromFile è più particolare nei file di immagine. Dipende dal tipo di file con cui ti occuperai.

2

Bene, un file viene spesso considerato anche come uno stream. Ecco perché la classe primaria per aprire i file si chiama FileStream. Ma esiste una funzionalità specifica del sistema operativo che può rendere più efficiente la gestione dei file di immagine con un lotto . Si chiama 'memory mapped files', una funzione che mappa il contenuto di un file direttamente in memoria. C'è del fumo e dei mirror coinvolti, ma essenzialmente rende il file direttamente disponibile senza doverlo leggere. La memoria necessaria per memorizzare i dati del file non occupa spazio nel file di paging.

Molto efficiente, lo si ottiene gratuitamente quando si utilizza FromFile() o il costruttore Bitmap (stringa) per un'immagine nel formato .bmp. Il caricamento di un'immagine da un flusso tende a richiedere due volte la quantità di memoria, sempre un problema con le immagini grandi.