2010-08-20 9 views
6

Akımların ne hakkında olduğunu asla anlayamadığımı itiraf etmeliyim - her zaman bunun bir internet olayı olduğunu düşündüm. Ama şimdi localy bir dosya yüklemek için bir akış kullanılan bir kod girmek ve avantaj de ... üzerinde yol hep yüklenen dosyalar bir akımın kullanılması için olup olmadığını merak:Resim dosyası yükleme 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

o dosyalarla uğraşırken ne zaman çerçevesinde optimizasyonlar olduğunu açıkça oldukça basit kod ve sadece mümkün - Eğer kod verileri bir dosyadan yükleme olacak biliyor Eğer
private void loadingUsingImageClass 
{  
    Image currentPicture = Image.FromFile(originalPath); 
} 

cevap

15

, Image.FromFile kullanın.

Akış kullanmak daha esnektir, ancak 'un bu esnekliğe ihtiyaç duymadığı sürece, esnekliğine, dosya çözümüyle devam edin. Bir As

+0

Görüntüye ihtiyacım olduğunda daha iyi yöntem, aynı anda birçok noktadan erişiliyor? Görüntüyü aynı anda 3 yerde göstermek ve düzenlemek de. – iamCR

+0

@SanthoshKumar: Başka bir soruda olması gereken daha fazla bilgi olmadan bunu cevaplamak zor. Image.FromFile'ın iyi olmasını beklerdim. –

2

Jon's cevaba bir ekleme:

Bildiğim kadarıyla gördüğünüz gibi iki yöntem ya aynı şeyi yapmazlar. Birincisi size "C:\"'daki ilk görüntüyü verir, ikincisi size bir yoldan bir görüntü verir. Dolayısıyla, ilk olarak eklenen karmaşıklık sadece akışları kullanması değil.

Bu eşdeğer olacaktır:

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

ve bu durumda

, kesinlikle daha iyidir Jon açıklandığı gibi Image.FromFile ile bunu sadece için.

3

Görüntü dosyaları ile uğraşmak isterseniz, elbette ikinci çözüm daha iyidir. İlk bölümünüzde, Bitmap bitmap = new Bitmap(fileStream); var, bir resim dosyasının her zaman Bitmap olmadığını biliyorsunuz, aynı zamanda JPEG/PNG/TIFF ve benzeri olabilir. Image.FromFile, farklı uzantılara sahip görüntü dosyaları ile uğraşmak için oldukça profesyonel.

Genel anlamda, FileStream dosya sorunlarında yaygındır; Image.FromFile ise görüntü dosyalarında daha özeldir. Ne tür dosyaları ele alacağınıza bağlı.

2

Bir dosya genellikle bir akış olarak da ele alınır. Bu yüzden dosyaları açmak için birincil sınıf FileStream denir. Ancak görüntü dosyaları ile uğraşmak için bir lot daha verimli özel bir işletim sistemi özelliği var. Bu, bir dosyanın içeriğini doğrudan belleğe eşleyen bir özellik olan 'bellek eşlemeli dosyalar' olarak adlandırılır. Bazı duman ve aynalar var, ama esas olarak dosyayı okumak zorunda kalmadan dosyayı doğrudan erişilebilir hale getiriyor. Dosya verilerini saklamanız gereken bellek disk belleği dosyasında yer almaz.

Çok verimli, .Fmp biçimindeki bir resim için FromFile() veya Bitmap (string) yapıcısını kullandığınızda, ücretsiz olarak alırsınız. Bir görüntüyü bir akıştan yüklemek, her zaman büyük resimlerle ilgili bir sorun olan 'u iki kez bellek miktarı gerektirir.