6

正直なところ、私はストリームが何であるかを理解していませんでした.私はいつもそれがインターネットのことだと思っていました. しかし今、ストリームを使用してファイル ローカリティをロードするコードに出くわし、ストリームを使用する利点があるかどうか疑問に思います...よく、いつもファイルをロードする方法:

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       
}

対。

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

4 に答える 4

16

コードがファイルからデータをロードすることがわかっている場合は、これを使用してください。Image.FromFileこれは明らかに単純なコードであり、ファイルを処理するときにフレームワーク内で最適化が行われる可能性があります。

ストリームを使用する方がより柔軟ですが、その柔軟性が必要でない場合は、ファイル ソリューションを使用してください。

于 2010-08-20T09:06:35.997 に答える
3

画像ファイルを扱いたい場合は、もちろん 2 番目の方法が適しています。最初のセクションではBitmap bitmap = new Bitmap(fileStream);、画像ファイルが常にビットマップであるとは限らず、JPEG/PNG/TIFF などの場合もあることがわかりました。さまざまな拡張子の画像ファイルをImage.FromFile扱うのは非常に専門的です。

一般的に言えば、FileStreamはファイルの問題で一般的ですが、 はImage.FromFile画像ファイルでより具体的です。処理するファイルの種類によって異なります。

于 2010-08-20T09:10:43.717 に答える
3

ファイルもストリームとして扱われることがよくあります。そのため、ファイルを開くための主要なクラスは FileStream と呼ばれます。しかし、イメージ ファイルの処理をより効率的にすることができる特定のオペレーティング システム機能があります。これは「メモリ マップ ファイル」と呼ばれ、ファイルの内容をメモリに直接マップする機能です。いくつかのスモークとミラーが関係していますが、基本的には、ファイルを読み取らずに直接利用できるようにします。ファイル データを格納するために必要なメモリは、ページング ファイルの領域を占有しません。

非常に効率的です。.bmp 形式の画像に FromFile() または Bitmap(string) コンストラクターを使用すると、無料で取得できます。ストリームから画像をロードすると、 2 倍の量のメモリが必要になる傾向があり、大きな画像では常に問題になります。

于 2010-08-20T11:06:59.323 に答える
2

Jonの答えへの追加として:

私が見る限り、2 つの方法はどちらも同じことをしません。1つ目は最初の画像を与え"C:\"、2つ目はパスから画像を与えるだけです。したがって、最初に追加された複雑さは、ストリームを使用しているという理由だけではありません。

これは同等です:

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

Image.FromFileその場合、ジョンが説明したように、それを行う方が確かに良い.

于 2010-08-20T09:09:17.287 に答える