2009-08-06 9 views
0

다른 이미지를 오버레이하려고합니다. 이 코드를 사용하면 다음을 수행 할 수 있습니다.GDI +로 이미지 오버레이

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb) 
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image)) 
g.DrawImage(Image.FromFile("C:\background.png"), New Point(0, 0)) 
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0)) 
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0)) 

처음 두 장의 사진과 함께 작동합니다. 그 후 OutOfMemoryException이 throw됩니다. 이미지의 크기가 크다는 것을 알고 있습니다. 하지만 어쨌든 오버레이를 수행하고 어딘가에 저장할 수 없습니까?

첫 번째 오버레이 결과를 디스크에 저장하고 메모리를 확보하고 다른 레이어를 추가하더라도 여전히 예외가 발생합니다.

이 문제는 어떻게 해결해야합니까?

JosP

답변

0

이것이 실제로 문제가되는지는 모르지만 비트 맵에 그리는 이미지는 삭제하지 않는 것이 좋습니다. 이게 도움이 되나요?

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb) 
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image)) 
Dim img As Image = Image.FromFile("C:\background.png") 
g.DrawImage(img, New Point(0, 0)) 
img.Dipose() 
img As Image = Image.FromFile("C:\firstlayer.png") 
g.DrawImage(img, New Point(0, 0)) 
img.Dispose() 
img As Image = Image.FromFile("C:\secondlayer.png") 
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0)) 
img.Dispose() 

나는 진지하게 내가 그 문제없이 이미지를 2 ~ 3 배 크기 일한대로, 이미지와 아무 상관이 의심한다. 또한 OutOfMemoryError 예외는 < 풍자 중 하나 인 것 같습니다. > 매우 유용한 </sarcasm > GDI는 메모리와 관련이없는 오류를 던집니다.

+0

Spot on! 그게 정확히 문제 였어! 나는 이것을 간과했다고 믿을 수 없다. 고마워, 대단히 크리스! –

0

첫 번째 빈 비트 맵이 필요합니까? 그게 없으면, 당신은 단지 3 * 2백메가바이트 대신 * 200메가바이트 4를 할당, 아마도이 작동합니다 :

Dim g As Graphics = Graphics.FromImage("C:\background.png") 
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0)) 
// and so on 

그것은 여러 단계로 중첩하여 작동하지 않는 이상하다, 난 당신이 올바르게 메모리를 해제하지 않을 생각 이 경우에. 아마도이 방법에 사용하는 코드를 게시하는 것이 좋습니다.

일부 이미지 편집 프로그램을 사용하여 PNG 파일을 병합하는 것이 매우 쉽기 때문에 원본 이미지가 필요하거나 특별히 C#/GDI +를 사용하여이 작업을 수행하려고한다고 가정합니다.

+0

그래픽 개체를 인덱싱 된 이미지 형식에서 인스턴스화 할 수 없으므로 첫 번째 비어 있습니다. –

+0

여러 단계에서 DrawImage 메서드를 호출 한 직후 Graphics 개체에서 Dispose 메서드를 호출 해 보았습니다. 중간 결과를 디스크에 저장 한 다음 다시로드하려고했습니다. 도움이되지 않습니다. 내가 오버레이하는 세 번째 이미지에서 여전히 예외가 발생합니다. ( g = Graphics.FromImage (gbkn) g.DrawImage (Image.FromFile (mstrPNGs : gbkn = Image.FromFile ("\ _ 1.bmp을 C :") 이 들어 나는 아래의 코드에 연속 호출을 사용 1)), New Point (0, 0)) gbkn.Dispose() g.Dispose() –

+0

예, PNG 파일은 미리 다른 프로그램에서 병합 할 수 없습니다. 이 프로그램에서 수행되어야합니다. 그리고 도움을 주셔서 감사합니다! 지난 며칠 동안 매우 혼자였습니다 ... –