2017-06-24 3 views
1

Ich habe einen Ordner mit Höhe Menge geolocated Datei, ich möchte eine KML mit der Ortsmarkierung machen. Kein Problem für das XML (KML) Dokument, aber das Bild ist groß und ich möchte einen Daumen (1/10) und ein kleines Bild (1/4) in einem separaten Ordner erstellen.
Das Bild sind 4000x3000 Allround 5 MB, für kleine Menge nicht Problem, aber wenn der Ordner mehr von 35 Bild (in debug) habe ich das Problem. Ich habe versucht, mit Einweg-Objekt mit Verwendung, GC.collect nur Bildverarbeitung, aber nichts verwendet.System.OutOfMemoryException aufgetreten in System.Drawing.dll mit großen Menge von Bild

Ich habe Ordner mit 1400 Bild oder mehr zu erarbeiten ... ist möglich, um diese Anwendung damit zu arbeiten?

public static class MyClass_img 
{ 
    public static void ResizeImage(Image image, int width, int height, string pathImage) 
    { 
     using (var destImage = new Bitmap(width, height)) 
     { 
      destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); 

      using (var graphics = Graphics.FromImage(destImage)) 
      { 
       graphics.CompositingMode = CompositingMode.SourceCopy; 
       graphics.CompositingQuality = CompositingQuality.HighQuality; 
       graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
       graphics.SmoothingMode = SmoothingMode.HighQuality; 
       graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

       using (var wrapMode = new ImageAttributes()) 
       { 
        wrapMode.SetWrapMode(WrapMode.TileFlipXY); 

        var destRect = new Rectangle(0, 0, width, height); 
        graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); 
       } 
      } 

      destImage.Save(pathImage); 
     } 
     GC.Collect(); 
    } 

    public static string imageReduce(Image img, string path, int percentValue, string extension, string folder) 
    { 
     var dirName = new DirectoryInfo(path).Parent.Name; 
     string pathImg = folder + dirName + "_" + Path.GetFileNameWithoutExtension(path) + extension; 
     AprItalia_img.ResizeImage(img, img.Width/percentValue, img.Height/percentValue, pathImg); 
     return pathImg; 
    } 

} 

enter image description here

+3

Das Bild, das Sie übergeben, wird wahrscheinlich nicht in 'imageReduce (Image img, ...)' umgewandelt. – CodeCaster

+0

Tun Sie 'GC.Collect()' nicht, es sei denn, es ist wirklich erforderlich, da häufiges Säubern den Verarbeitungsdruck erhöht. –

+0

Auch was ist der RAM Ihres Systems? –

Antwort

0

Sie müssen GC.Collect nicht() aufrufen.

Per MSDN,

immer Dispose aufrufen, bevor Sie den letzten Verweis freigeben> auf das Bild. Andernfalls werden die verwendeten Ressourcen reserviert nicht> befreit werden, bis der Garbage Collector ruft das Bild> Objekt Finalize-Methode

Also in Ihrem Fall scheint es für finalize.Also zu gehen, werden Sie auch das Bildobjekt Freigabe indem Sie anrufen, ist es zu entsorgen?

Verwandte Themen