2011-09-20 2 views
1

이미지 객체를 가져 오는 메서드가있는 Im에 1 개의 색상 채널 (다른 2 개는 검정색)으로 처리 한 다음 프로세스에서 새 이미지를 반환합니다.이미지 객체를 잘못 반환하는 방법

이제 문제는 메서드에서 새 이미지를 만들고 디버깅하는 동안 개체를 보면 완벽하게 잘 보입니다.

public Image GetRedImage(Image sourceImage) 
    { 
     using (Bitmap bmp = new Bitmap(sourceImage)) 
     using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height)) 
     { 
      for (int x = 0; x < bmp.Width; x++) 
      { 
       for (int y = 0; y < bmp.Height; y++) 
       { 
        Color pxl = bmp.GetPixel(x, y); 
        Color redPxl = Color.FromArgb((int)pxl.R, 1, 1); 

        redBmp.SetPixel(x, y, redPxl); 
       } 
      } 
      Image tout = (Image)redBmp; 

      return tout; 
     } 

    } 

사람이 도대체 무슨에 어떤 아이디어를 가지고 : 그 이미지 객체 안에 모든 쇼 "System.ArgumentException"여기

을 개체 속성을 빈 이미지로 돌아올 때하지만 그 방법의 코드는 진행되고있다?

많은 감사.

답변

1

.

상단에서이 두 줄을 교체하려고 :

using (Bitmap bmp = new Bitmap(sourceImage)) 
using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height)) 

로 :

Bitmap bmp = new Bitmap(sourceImage); 
Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height); 

지금은 프로그램 논리에 따라 작동합니다 수동으로 나중에 그 이미지를 처리해야합니다.

당신은 아마 당신이 기본적으로 반환되는 것과 반드시 ​​redBmp 개체를하지 사용하고 있지만으로도 bmp을 처분 할 수있는, 그래서 중 당신은 그것을 복제하고 복제를 반환, 또는 당신이 그것을 버리지 않는, 또는 당신은 배치 사용할 수없는 객체를 반환 지금 무슨 일이 일어나고 있는지.

+0

*는 감사합니다 모두 당신이 가 제대로 반환 지금 많은 많은 감사 – Gelion

+1

후 답변을 투표하고 당신은 최고의 고려를 받아 (특히 다비드에) 도움을 * 을 웃는다 ;-) –

3

redBmp가 사용중인 블록에 의해 삭제되고 tout가 이미지 유형으로 redBmp가 전송됩니다. redBmp에 대한 using 블록을 삭제하십시오.

Dispose 방법이 때 방법 종료라고 있어요 그래서 당신은 using 성명에서 redBmp을 포장 한

1

메노. 메서드 외부에서 사용하려고한다면 (Image으로 캐스팅 한 후 반환하는 것이므로) 처리하지 않아야합니다. 당신은 즉시 당신이 사용 범위를 떠나기로 이미지를 폐기하는 using 블록을 사용하여

public Image GetRedImage(Image sourceImage) 
{ 
    Bitmap redBmp = null; 
    using (Bitmap bmp = new Bitmap(sourceImage)) 
    { 
     redBmp = new Bitmap(sourceImage.Width, sourceImage.Height); 
     for (int x = 0; x < bmp.Width; x++) 
     { 
      for (int y = 0; y < bmp.Height; y++) 
      { 
       Color pxl = bmp.GetPixel(x, y); 
       Color redPxl = Color.FromArgb((int)pxl.R, 1, 1); 

       redBmp.SetPixel(x, y, redPxl); 
      } 
     } 
    } 

    return redBmp as Image; 
} 
관련 문제