2017-06-24 1 views
1

高さのジオロケーションファイルがあるフォルダがあります。私は目印を付けてKMLを作成します。 XML(KML)文書で問題はありませんが、画像が大きく、サムフォルダ(1/10)と小さな画像(1/4)を別々のフォルダに作成したいと思います。
イメージは4000x3000 allround 5mbですが、少量で問題はありませんが、35個以上のイメージ(デバッグ時)を持つフォルダに問題があります。 私は使い捨てのオブジェクトを使って試してみました。GC.collectを使用して画像の精緻化のみを試みましたが、何もありません。大量の画像を持つSystem.Drawing.dllでSystem.OutOfMemoryExceptionが発生しました

私は1400以上の画像で詳しく説明するフォルダがあります...このアプリケーションを使ってこのアプリケーションを動作させることは可能ですか?

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

'imageReduce(Image img、...)'に渡したイメージを破棄しているとは限りません。 – CodeCaster

+0

頻繁なクリーンアップが処理圧力を上げるので、本当に必要でない限り、 'GC.Collect()'はしないでください。 –

+0

また、あなたのシステムにはどのようなRAMがありますか? –

答えて

0

あなたはGC.Collect()を呼び出す必要はありません。 MSDN 1として

あなたの最後の参照を解放する前に、必ず処分を呼び出す>画像へ。それ以外の場合は、ガベージコレクタがImage>オブジェクトのFinalizeメソッドを呼び出すまで、使用しているリソースは解放されません。

したがって、あなたの場合は、finalize.Alsoそれを処分すると呼ぶことによって?

関連する問題