이번 질문은 메모리와 관련된 내용인데요…
이미지 캡쳐를 해서 계속해서 화면에 업데이트 하는 간단한 프로그래을 만든다고 했을때 인데요…
메모리가 계속올라가는 것이 좀 걸려서 using 문으로 다음과 같이 하려고 하는데요…
private Bitmap method1(Bitmap b)
using (var b = new Bitmap(xxx, xxx))
{
b에 대한 픽셀 처리
return b
}
위와같은 method1 을 호출했을때 using에 의해서 메모리가 해제되버리니 메서드 호출후에
pictureBox에 처리한 b를 넣으려하면 에러가 나 버리는데요…이럴때 메모리 문제도 해결하고
pictureBox에 이미지를 잘 넣어줄수 있는 방법이 있나요?
질문이 너무 이상한거 같기도 한데 제가 하려는걸 모두 설명드리기에 한계가 있다보니 요점만 문의드리는점
양해부탁드립니다.
초보자니까 드리는 질문이라 생각해 주시면 감사드리겠습니다.
제가 이해를 잘못해서 다시 한번 여쭙겠습니다.
예를 들어 아래와 같이 한다고 하면요…
public partial class Form1 : Form
{
Bitmap a = new Bitmap(pictureBox1.image);
pictureBox2.image = method1(a);
private Bitmap method1(Bitmap b); {
using (var b = new Bitmap(xxx, xxx))
{
b에 대한 픽셀 처리
return b
} }
}
위 코드에서 pictureBox2에 이미지를 넣으려 할때 이미 method1에서 b가 해제되어 버려서
에러가 나는것 같은데요…이럴때 pictureBox2에 위에 예처럼 using문을 사용하면서 할수 있는 방법이
있나해서 여쭙네요~~
위에 @level120 님이 말씀한 것 처럼 using 대상은 IDisposable 인터페이스를 구현한 무엇입니다.
이 인터페이스를 구현한 대상은 필요로 할 때 자원을 해제하는 기능을 제공하게 됩니다.
여기서는 Bitmap이 되고요.
picturebox에 픽셀처리된 Bitmap을 계속 설정하게 되면 메모리가 증가합니다. 이유는,
.NET은 메모리 해제를 가비지 컬렉터에 위임하기 때문인데요, 그 반증으로 C#으로 짠 코드는 할당된 개체를 해제하는 메커니즘이 없습니다.
그런데, 가비지 컬렉터에 의해서 메모리를 정리하는 것은 상황에 따라 문제가 있습니다. 가령, 해제가 되기 까지 그 자원을 쓸 수 없다던가, 메모리가 해제되기까지 상황은 메모리가 계속 증가하게 되기 때문에, 그 상황이 사용자 친화적이지 않을 수 있습니다. 이런 상황 때문에 IDisposable 인터페이스가 등장했고 C#에서는 using을 통해 즉각적으로 자원을 해제합니다. 그 해제 대상은 관리 자원(GC 대상) 수도 있고 비관리 메모리(GC 대상이 아님)일 수도 있고 둘 다 일수 있습니다. 그러나 지금은 너무 깊게 들어가지 맙시다.
Bitmap을 할당하고 관련 픽셀처리를 한다.
picturebox에 작업한 비트맵을 적용한다.
다시 1로 이동
이런 로직이라고 할 때 다음처럼 구현해야 합니다.
Bitmap을 할당하고 관련 픽셀처리를 한다.
picturebox에 기존 비트맵이 있다면 임시 변수에 복사한다.
picturebox에 작업한 비트맵을 적용한다.
임시 복사한 비트맵을 해제 한다. (beforeBitmap이라고 가정했을 경우 beforeBitmap.Dispose())