2015-03-05 25 views
5

Bir görüntüyü dosyadan yüklemek için çeşitli yollarla birkaç saat deney yapıyorum. Lütfen şu iki yönteme bir bakın:Resimin Yüklemesi

public Image SlowLoad(string path) 
    { 
     return Image.FromFile(path); 
    } 

    public Image FastLoad(string path) 
    { 
     using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path))) 
      return Image.FromStream(ms); 
    } 

İkinci yöntem 2 kat daha hızlıdır. Burada neyi özlüyorum? Neden böyle? .NET geliştiricilerinin yazdığım yöntemi kullanarak Image.FromFile uygulamasını daha hızlı gerçekleştiremediğine inanamıyorum. So => Yanlış bir yerdeyim. Lütfen bana nerede olduğunu söyle. İkinci yöntem neredeyse 2 kat daha hızlı mı? Kodum tamamen doğru mu? (diş güvenli, vb.). Belki Image.FromFile daha güvenli midir?

+0

Eğer sadece yöntemini çağırmak için aldığı sürenin ölçülmesiyle Are: Ayrıca MS Referans Kaynağı System.Drawing.Image bazı ilginç açıklama var mı? Image.FromFile', “Image.FromStream” in bir takım ayrıştırma vb. Bilmiyorum ama spekülasyon yapıyorum - bunun gerçek bir kullanıcı arayüzünde etkisi olabileceğini görebiliyor musunuz? görüntüleri gösterir? –

+1

Sadece bir fyi: [reference.microsoft.com] (http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,f7cc7221ba00597a) –

+1

İkinci yönteminiz tüm dosyanın olmasını gerektirir. okunmadan önce belleğe yüklenir, ilk yöntem (belki de) değildir. Belki Image.FromFile(), düşük bellek ayak izi için optimize edilmiştir, böylece dosyadan yalnızca bir seferde küçük bir arabellek yükler. – adv12

cevap

2

AFAIK: Her şeyden önce Image.FromFile, GDI + GdipLoadImageFromFile * işlevlerini sarar, bunların garip bir hayatı vardır. GDI + image tüm kullanım ömrü boyunca (dosya ya da akış) kaynağını saklayabilir ve kullanabilir. http://support.microsoft.com/en-us/kb/814675. Yani, burada olası "çoklu dosya io" vs "çoklu akış io".

http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,181

class Image { 
    ............ 
    public static Image FromFile(String filename, 
            bool useEmbeddedColorManagement) 
    { 
     ............  
     //GDI+ will read this file multiple times. 
     ............ 
    } 
}