2010-08-20 5 views
6

Ich muss zugeben, dass ich nie verstanden habe, worum es bei den Streams geht - ich dachte immer, es ist eine Internet-Sache. Aber jetzt laufe ich in einen Code, der einen Strom verwendet, um eine Datei zu laden localy und ich frage mich, ob es einen Strom für die Verwendung von mehr als Vorteil ist ... na ja, wie ich immer geladene Dateien:Laden einer Bilddatei 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); 
} 

Antwort

15

Wenn Sie wissen Code werden die Daten aus einer Datei werden geladen, zu verwenden Image.FromFile - es ist offensichtlich eher einfacher Code, und es ist nur möglich, dass es Optimierungen im Rahmen, wenn es mit Dateien zu tun hat.

Verwenden Sie einen Stream ist flexibler, aber wenn Sie benötigen diese Flexibilität, gehen Sie mit der Datei-Lösung.

+0

Welche Methode ist besser, wenn ich auf mein Bild von vielen Punkten gleichzeitig zugreifen muss ?. Wie das Bild an 3 Stellen gleichzeitig zeigen und auch bearbeiten. – iamCR

+0

@SanthoshKumar: Es ist schwer zu beantworten, ohne weitere Informationen, die in einer anderen Frage sein sollte. Ich würde erwarten, dass "Image.FromFile" in Ordnung ist. –

2

Als eine Ergänzung Jon's Antwort:

Soweit ich sehe, die beiden Methoden entweder die gleiche Sache nicht tun. Der erste gibt Ihnen das erste Bild in "C:\", wo die zweite nur ein Bild von einem Pfad geben. Die zusätzliche Komplexität in der ersten ist nicht nur, weil es Streams verwendet.

Dies entspräche:

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

und in diesem Fall ist es auf jeden Fall besser ist, es zu tun nur mit Image.FromFile wie Jon erklärt.

3

Wenn Sie mit Bilddateien umgehen wollen, ist die zweite Lösung natürlich besser. In Ihrem ersten Abschnitt haben Sie Bitmap bitmap = new Bitmap(fileStream); Sie wissen, dass eine Bilddatei nicht immer Bitmap ist, es kann auch JPEG/PNG/TIFF und so weiter sein. Während Image.FromFile ziemlich professionell ist, um mit Bilddateien mit verschiedenen Erweiterungen umzugehen.

Im Allgemeinen ist FileStream bei Dateiproblemen üblich, während Image.FromFile bei Bilddateien genauer ist. Es hängt davon ab, mit welcher Art von Dateien Sie es zu tun haben.

2

Nun, eine Datei wird oft auch als Stream behandelt. Aus diesem Grund heißt die primäre Klasse zum Öffnen von Dateien FileStream. Aber es gibt eine bestimmte Betriebssystem-Funktion, die den Umgang mit Bilddateien effizienter machen kann. Es heißt "Memory Mapped Files", eine Funktion, die den Inhalt einer Datei direkt dem Speicher zuordnet. Es ist etwas Rauch und Spiegel beteiligt, aber es macht im Wesentlichen die Datei direkt verfügbar, ohne sie zu lesen. Der Speicher, den Sie zum Speichern der Dateidaten benötigen, nimmt in der Auslagerungsdatei keinen Platz ein.

Sehr effizient, Sie erhalten es kostenlos, wenn Sie FromFile() oder den Bitmap (string) -Konstruktor für ein Bild im BMP-Format verwenden. Laden eines Bildes aus einem Stream neigt dazu, zweimal die Menge an Speicher, immer ein Problem mit großen Bildern.

Verwandte Themen