2012-05-20 3 views
0

파일에서 비트 맵을로드하고 일부 작업을 수행 한 다음 동일한 파일 이름으로 다시 저장하려고합니다. 패턴은 다음과 같습니다.C++. 비트 맵을 처리하는 방법?

Bitmap in = gcnew Bitmap(fileName); 
Bitmap out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat); 

fill [out] with data from [in] 

out.Save(fileName); 

그러나 이것은 작동하지 않습니다. 그건 분명하다. 아직 열어 둔 파일에 저장할 수 없습니다 (비트 맵 때문에). 질문은 : 도대체 어떻게 비트 맵을 닫을까요?! 나는 여러 가지 방법을 시도했지만 아무런 효과가 없습니다. C#에서는 Dispose를 호출했지만 C++에서는이 메서드가 보호됩니다. 전화 걸기도 작동하지 않습니다. 해결책은 무엇입니까?

편집 : 하나의 비트 맵에서 작동해도 작동하지 않습니다. 그러나 나는 문제를 발견했다. 전화 걸기가 작동했습니다. 비트 맵을 포인터로 선언하는 걸 잊었습니다.

Bitmap^ in = gcnew Bitmap(fileName); 
Bitmap^ out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat); 

fill [out] with data from [in] 

delete in; 
out.Save(fileName); 
+0

아직 http://msdn.microsoft.com/en-us/library/ms177197.aspx를 보셨습니까? – user287107

답변

0

out 비트 맵이 필요하지 않습니다. in을 편집하여 저장하십시오. 또한 내가 대신

CImage image; 
image.Load(filename); 
fill [image] with whatever data you want 
image.Save(filename); 
+0

왜 'CImage'를 사용하는 것이 좋습니까? – svick

+0

IMO를 사용하는 것이 더 쉽고 많은 다른 이미지 형식을 허용합니다. –

1

이 C++/CLI 코딩의 일반적인 함정, 당신은 stack semantics을 사용하고있는 C 화상 클래스를 사용하여 조언을 것입니다. 즉, 참조 유형 변수를 ^ 모자와 함께 선언하지 않았습니다. 컴파일러가 범위 블록의 끝에 Dispose() 호출을 자동으로 내 보냅니다. 매우 편리하고 C++에서 RAII 패턴의 시뮬레이션을 수행하지만 여기까지 이어집니다. 새 비트 맵을 저장하기 전에 in 비트 맵을 처리하려고합니다.

두 가지 방법이 있습니다. 당신은 추가 중괄호 범위 블록으로 게임을 할 수있다 :

Bitmap^ out; 
try { 
    { 
     Bitmap in(fileName); 
     out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat); 
     // etc.. 
    } // <== "in" gets disposed here 
    out->Save(fileName); 
} 
finally { 
    delete out; 
} 

을하지만 그게 바로이 특정한 경우에 out 위해 혼합 할 필요 특히 때문에, 좀 추한. 대안은 명시 적으로 모든 것을 수행하는 것입니다.

Bitmap^ out; 
Bitmap^ in; 
try { 
    in = gcnew Bitmap(fileName); 
    out = gcnew Bitmap(in->Width, in->Height, in->PixelFormat); 
    // etc.. 
    delete in; 
    in = nullptr; 
    out->Save(fileName); 
} 
finally { 
    delete in; 
    delete out; 
} 
+0

두번째 예에서'delete in;'은'in'을 처리합니까? – shoelzer

관련 문제