2014-11-21 2 views
1

그래서 현재 작업/매우 잘 작동하지만 내가 너무 많은 이미지를 한 번에 프로그램을 처리하는 동안 OutOfMemoryException 준 예외로 이미지 resizer 노력하고 있습니다.문을 사용하여 반환 후 비트 맵 ArgumentException

그래서 나는 비트 맵을 올바르게 처리 할 수 ​​있도록 using 문 안에 메서드를 래핑했습니다.

public Bitmap ResizeImage(MemoryStream ms, Size size) 
    { 
     if (comboBox2.Text == "Pixel") 
     { 
      using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height)) 
      { 
       var original = new Bitmap(ms, true); 
       Graphics graphic = Graphics.FromImage(img); 

       //IRRELEVANT CODE..... 

       return img; 
      } 
     } 
     else 
     { 
      return null; 
     } 

그리고 여기에 내가 저장하려고하면

그러나 나는 using 문 안에 내 비트 맵을 반환하고 있다면이 여기에 메시지

내 ImageResize 방법 "경우 ArgumentException이 처리되지 않은했다"얻을 것으로 나타났습니다 ImageResize 메서드 외부 이미지 :

private void button1_Click(object sender, EventArgs e) 
    { 
    //IRRELEVANT CODE ... 
    img = ResizeImage(memory, new Size(getX(), getY())); 
    //IRRELEVANT CODE ... 
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here 
    } 

사용 문을 제거하면 모든 것이 완벽하게 정상적으로 작동하지만 다시 사용해야합니다. 비트 맵을 처리하기 위해 블록을 사용하여 메모리 누수를 방지합니다. 또한 using 문 내부에 이미지를 저장할 때 문제가 없지만 해결책은 아닙니다.

내가 뭘 잘못하고 있니? 나에게 그것은 비트 맵이 올바르게 리턴되지 않는 것처럼 보인다.

나는 당신은 당신이 잘못된 위치에 사용 넣어 미리 Ravand

+0

나는'// IRRELEVANT CODE ... '주석을 좋아합니다. 그것은 [이 스레드에 속한다] (http://stackoverflow.com/q/184618/2596334). –

+0

하하하 (Hahaha)가 원하는 경우 게시하십시오. D하지만 솔직히이 경우에는 관련이 없습니다. – Ravand

답변

0

내가 마지막으로 메모리 누수와 문제를 해결 내가 참/해제 이미지를 배치하는 것을 밝혀졌다하지만 빠른만큼 그 일을하지 않은 확인 아주 큰 이미지를 많이 처리 할 때이 outOuFMemoryException이 발생했습니다. 모든 것을 멀티 스레드로 만들고 항상 WorkingSet이 성공하지 못하면 더 작아지기를 기다렸습니다.

는 내가 thhought보다 쉬웠다 밝혀졌다 내가했던 일은, 나의 크기 조정 방법의 끝이를 넣어 :

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
System.Threading.Thread.SpinWait(5000); 

을 그리고 이것은 10로 큰 이미지 크기를 조정하기위한 마법을 할 것 같다 해상도는 20mb, 해상도는 10000x10000입니다. 누군가 SpinWait이 도움이되는 이유를 설명 할 수 있습니까? 실을 자려고 할 때마다 기억을 풀어주는 것도 잠자는 것처럼 보였다.

5

에 어떤 도움과 감사를 주셔서 감사합니다. using 블록이 끝나면 (블록에서 반환되는 것을 포함) 블록에 의해 제어되는 객체가 삭제됩니다. 폐기 된 비트 맵에 액세스하는 것은 오류입니다.

귀하 대신 여기에 요구 사항을 사용 :

private void button1_Click(object sender, EventArgs e) 
{ 
    //IRRELEVANT CODE ... 
    using(img = ResizeImage(memory, new Size(getX(), getY()))) 
    { 
     //IRRELEVANT CODE ... 
     img.Save(outputFileName, codec, encoderParams); 
    } 
} 
+0

관련성이 낮은 코드에 대한 세부 정보를 제공하거나 한 번에 처리 할 수있는 이미지의 수를 제한하십시오. –

+0

아아아아, 나는 Missread, 나는 MemoryException을 얻지 못했지만, ResizeImage 메소드의 버튼 클릭 이벤트에서받은 ArgumentException을 얻었습니다. 그래서 친절한 곳으로 돌아 왔습니다. – Ravand

+0

1. 당신은'ResizeImage'에서'using'을 제거 했습니까? 2. 무슨 논쟁? –