2015-03-13 21 views
7

Bazen çok büyük bir yapı çizimleri var, bazen 22466x3999, biraz derinlik 24 veya daha büyük. Bunları daha küçük sürümlere yeniden boyutlandırabilir ve görüntünün bölümlerini daha küçük resimlere ayırabilmem gerekir. görüntü kırpmaC# Büyük resimleri kırp ve yeniden boyutlandır

 public static void ResizeImage(string OriginalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider) 
     { 
      System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFile); 
      if (OnlyResizeIfWider) 
      { 
       if (FullsizeImage.Width <= NewWidth) 
       { 
        NewWidth = FullsizeImage.Width; 
       } 
      } 
      int NewHeight = FullsizeImage.Height * NewWidth/FullsizeImage.Width; 
      if (NewHeight > MaxHeight) 
      { 
       NewWidth = FullsizeImage.Width * MaxHeight/FullsizeImage.Height; 
       NewHeight = MaxHeight; 
      } 
      System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero); 
      FullsizeImage.Dispose(); 
      NewImage.Save(NewFile); 
     } 

Ve bu kodu:

ben here bulunan resimlerden yeniden boyutlandırmak için aşağıdaki kodu kullanıyoruz

public static MemoryStream CropToStream(string path, int x, int y, int width, int height) 
     { 
      if (string.IsNullOrWhiteSpace(path)) return null; 
      Rectangle fromRectangle = new Rectangle(x, y, width, height); 
      using (Image image = Image.FromFile(path, true)) 
      { 
       Bitmap target = new Bitmap(fromRectangle.Width, fromRectangle.Height); 
       using (Graphics g = Graphics.FromImage(target)) 
       { 
        Rectangle croppedImageDimentions = new Rectangle(0, 0, target.Width, target.Height); 
        g.DrawImage(image, croppedImageDimentions, fromRectangle, GraphicsUnit.Pixel); 
       } 
       MemoryStream stream = new MemoryStream(); 
       target.Save(stream, image.RawFormat); 
       stream.Position = 0; 
       return stream; 
      } 
     } 

Sorunum i elde ediyoruz Görüntüyü yeniden boyutlandırmaya çalıştığımda Sytem.OutOfMemoryException ve tam görüntüyü FullsizeImage'a yükleyemem.

Ne bilmek isterim, görüntünün tamamını belleğe yüklemeden nasıl yeniden boyutlandırırım?

+0

görürseniz ancak * * sanal bellek artırma makinenizin boyutunu deneyebilirsiniz ve bakın. – Kurubaran

+0

Bu resim boyutları için LockBits ile çalışıyor olmalısınız – Vajura

+0

@Kurubaran Çalışmayan bellek boyutunu artırmaya çalıştım ve bunun bir web projesi için doğru çözüm olduğunu düşünmüyorum. –

cevap

5

Orada OutOfMemoryException çünkü görüntülerin büyüklüğü değil şansı vardır, ama doğru tüm tek kullanımlık sınıfları atmayın çünkü:

  • Bitmap target
  • MemoryStream stream
  • System.Drawing.Image NewImage

, gerektiği gibi bertaraf edilmez. Çevresinde bir using() ifadesi eklemelisiniz.

Bu hatayı gerçekten tek bir görüntüyle karşılıyorsanız, projenizi x64'e geçirmeyi düşünmelisiniz. Bir 22466x3999 resim bellekte 225Mb anlamına geliyor, bence bu x86 için bir sorun olmamalı. (Bu yüzden önce nesnelerinizi atmaya çalışın).

Son olarak, büyük resimleri yeniden boyutlandırmak/kırpmak için Magick.Net çok etkilidir.

+0

Teşekkür ederim, Fullsizeimage'e ve diğer yerlere '()' yi ekleyeceğim. Magick.Net'i denedim, ancak işe yaramaya gelemedim, ama eğer bu işe yaramıyorsa bir deneme yapacağım. –

+0

Image Magick.Net gitmenin yolu olmalı çünkü ekleyerek hala bir 'OutOfMemoryException' döndürdü. Ve eğer Image Magick.Net işe yaramazsa, tüm görüntülerin yeniden boyutlandırılmasını ve kırpılmasını sağlayan ayrı bir servis yapacağım. –

+1

Büyük 64bit sistemde bile, rasgele boyutlarda Bitmap'ler oluşturamazsınız. Eğer gerçekten büyük bir Bitmap ile çalışacaksa, 3. parti libre kullanmanın en iyi seçenek olduğu korkarım ki .. – TaW

1

Ayrıca, görüntüyü doğrudan diskten okumak ve bellek önbelleğini durdurmak için de kullanabilirsiniz.

Kullanım

sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);

yerine

...System.Drawing.Image.FromFile(OriginalFile);

Bu bir programlama çözüm değildir https://stackoverflow.com/a/47424918/887092

İlgili konular