2010-08-24 17 views
6

Çok büyük bir resim yüklemeye çalışıyorum (14473x25684), ancak bir bellek sınırlamasına giriyorum.OutofMemoryException - Son Derece Büyük Görüntü Yükleme

İşte sorun göstermek için basit bir programdır:

static void Main(string[] args) 
{ 
    string largeimage = @"C:\Temp\test_image.jpg"; // 14473x25684 

    Image i = Bitmap.FromFile(largeimage); // OutofMemoryException was unhandled 
} 

Şimdi mesele benim ne kadar fiziksel bellek alakalı olmadığını biliyoruz, fakat daha ziyade bir adresleme sınırlamadır. Bu sınırlamayı aşmak için yapabileceğim bir şey var mı?

Görüntü gerçekten geçerlidir ve Photoshop'ta (VM Boyutu: 916MB) ve ACDSee'de düzgün şekilde açılır. Ayrıca, listelenen boyutlar tam olarak değil, boyutları Google ile uğraşmayın. :)

Zaman ayırdığınız için teşekkür ederiz.

+0

Daha önce buna rastladım. Anlatabildiğim şeye göre başlıyor. –

+0

Vay. Bu büyük bir resim. Ne yazık ki, Bitmap sınıfı çerçevesi ihtiyaçlarınızı karşılamayacaktır. Bitmap başlığını kendiniz sıraladığınız ve pikselleri daha yönetilebilir bir görüntü boyutuna örneklediğiniz yığınsal bir yaklaşımın sizin için en iyi yol olduğunu görebilirsiniz. Bu bir meydan okuma olsa da, küçük bir tekerlek yeniden inşası gerektiriyor. Photoshop ve ACDSee, sıkıştırılmamış görüntünün tamamını belleğe yüklerse şaşırırım. – kbrimington

cevap

4

Bitmap sınıfı bu örneği tutmak için bellek 1.5GB etrafında gerektirecektir cevaplar. .NET bellek ayırıcısı normalde 1GB işareti etrafında boğulur.

0

OS, bitişik miktarda bellek ayıramaz. Bu konuda yapabileceğiniz tek şey, MemoryFailPoint kullanımı ve InsufficientMemoryException'ı yakalamadır. Ancak bu yalnızca sizi uygulama çökmesinden kurtarır.
Bana gelince, büyük bir dosya açmak için ikili okuyucu kullanmalı ve System.Drawing aracılığıyla bir dosya çizmelisiniz.

burada iyi bir soru ve When is it OK to catch an OutOfMemoryException and how to handle it?

+0

OS bunu yapabilir (eğer bir 64-bit işletim sistemi ise), ancak .NET çerçevesi (64 bit olsa bile) yapamaz. –

İlgili konular