2009-02-16 15 views
21

Bir görüntüGörüntüyü yüklemeden .NET'te görüntü boyutlarını nasıl güvenilir bir şekilde alabilirim?

Image.FromFile("cat.jpg").Size 

büyüklüğü (x, y) olsun ama bu bellekten resim yükleme gerektirir biliyorum.

Ben bana boyutu gösterir Windows Explorer görüntüleri görüntülerken.

  • nasıl bu boyutu erişebilirim?
  • Tüm görüntüler için güvenilir midir? Windows gezgini, boyutun kullanılabilir olması için önce görüntünün "görülmesini" gerektiriyor mu? Bir sunucuya yüklemek istemiyorum ve internet explorer'a yüklemeden önce meta verilerim yok.

Düzenleme: ben istediğim hangi boyutta netleştirmek için 'boyutları' olarak 'beden' den konuyu değiştirdi.

cevap

3

bu genellikle aslında dosyayı açmadan içerir ve biçimini ve boyutunu bulmak için sadece başlık (ilk birkaç bayt) okuma yapmak. Boyutu bulmak için dosyanın tamamını okumak zorunda değilsiniz. Bazen boyut, dosyadaki belirli bir sapmada bile, bu yüzden boyutu bulmak yalnızca 8 bayt okuyor.

Aslında pencereler kendisi boyutunu bulmak için yapar kaşif öğrenmek için filemon.exe kullanabilirsiniz. Eğer dışarı Resmin yüklenmesi ile görüntü boyutları (genişlik ve yükseklik) almak istiyorsanız

+0

Windows, diskin görüntünün ne kadar alana ayrıldığını sorduğunda, işletim sistemini doğrudan doğruya araştırmaz mı? Dosya özniteliği değil mi? Ya da söylediğin gibi meta veri kodlu? – Paxic

+0

@panix - Seni şaşırtsaydım özür dilerim. Ben genişlik + yükseklik olarak boyutu ve byte olarak boyutu değil demek istiyorum. –

+0

@shy Eğer kaşif ne yapar, biliyor musunuz? Windows Explorer'ın sahip olduğu meta verilere güvenebilir miyim?Ben sadece bu bazı garip kenar durumlarda biraz sinsi ve muhtemelen güvenilmez olduğunu düşünüyorum - bu yüzden ben –

11

, sen jpeg bir bölümü aşağıda dosyasını kendiniz okumak gerekir. İşte

sen, Bu benim kodu değil

public static Size GetJpegImageSize(string filename) { 
    FileStream stream=null; 
    BinaryReader rdr=null; 
    try { 
     stream=File.OpenRead(filename); 
     rdr=new BinaryReader(stream); 
     // keep reading packets until we find one that contains Size info 
     for(; ;) { 
      byte code=rdr.ReadByte(); 
      if(code!=0xFF) throw new ApplicationException(
        "Unexpected value in file "+filename); 
      code=rdr.ReadByte(); 
      switch(code) { 
       // filler byte 
       case 0xFF: 
        stream.Position--; 
        break; 
       // packets without data 
       case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: 
       case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9: 
        break; 
       // packets with size information 
       case 0xC0: case 0xC1: case 0xC2: case 0xC3: 
       case 0xC4: case 0xC5: case 0xC6: case 0xC7: 
       case 0xC8: case 0xC9: case 0xCA: case 0xCB: 
       case 0xCC: case 0xCD: case 0xCE: case 0xCF: 
        ReadBEUshort(rdr); 
        rdr.ReadByte(); 
        ushort h=ReadBEUshort(rdr); 
        ushort w=ReadBEUshort(rdr); 
        return new Size(w, h); 
       // irrelevant variable-length packets 
       default: 
        int len=ReadBEUshort(rdr); 
        stream.Position+=len-2; 
        break; 
      } 
     } 
    } finally { 
     if(rdr!=null) rdr.Close(); 
     if(stream!=null) stream.Close(); 
    } 
} 

private static ushort ReadBEUshort(BinaryReader rdr) { 
    ushort hi=rdr.ReadByte(); 
    hi<<=8; 
    ushort lo=rdr.ReadByte(); 
    return (ushort)(hi|lo); 
} 

:) biraz zaman geri kod projesinde bu örneği var için kutu yönteminin yetersiz olduğunu. Kopyaladım ve program parçacıklarına kaydettim, bağlantıyı hatırlamıyorum.

+2

ugh! lol. whoa çok kod var. Ayrıca bir web ortamında çalışıyorum, bu yüzden de gif ve çarklarım olabilir. Image.FromFile ("cat.jpg") önbelleğe doğru eğimliyim.boyut - veya en azından zamanlama bir görüntüde okumak için ne kadar zaman alır –

+0

Evet - boyut bilgileri ile üstbilgiyi okumak için jpg'yi açar. – amazedsaint

32

Image.FromStream(Stream, bool, bool) dosyasını "yanlış" 2. ve 3. parametreyle birlikte dosya belleğe yüklemekten kaçınmak için kullanabilirsiniz. başlık resmine ilişkin kendi indeksi oluşturma

  • eksik ise

    • tam görüntü yükü döndükten sonra, dosya başlıkları Okuma
    • Çoklu-işlem
    nitelikleri:
  • +1

    ihtiyacım olan şey; hayır bayt yönetimi, vb. Teşekkürler! –

    +0

    +1 Benim için çalışıyor ... – takrl

    1

    - LoadImage() ilerleme geri arama belirten bir geçersiz kılma vardır. Belki de başlık okunduktan sonra yükleme işlemini iptal etmek için kullanabilirsin?

    İlgili konular