2011-01-17 7 views
0

GDI +를 사용하여 ImageList에 저장 한 두 개의 PNG를 병합 한 다음 PictureBox에 표시하려고합니다. 내 PictureBox 크기, 첫 번째 이미지 크기 및 두 번째 이미지 크기가 모두 동일합니다. 이 코드는 간단 할 것이라고 생각했지만 다음 코드는 작동하지 않으며 이유가 확실하지 않습니다. 검색 한 적이 있지만 PictureBox를 다루는 코드 스 니펫을 찾을 수 없습니다.두 개의 투명한 이미지를 Picturebox에 병합

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    PictureBox1.Image = Nothing 
    Dim myGraphic As Graphics = PictureBox1.CreateGraphics 
    myGraphic.DrawImageUnscaled(ImageList1.Images(0), 0, 0) 
    myGraphic.DrawImageUnscaled(ImageList1.Images(1), 0, 0)   
End Sub 

내가 누락 된 부분을 아는 사람이 있습니까? 순간에 버튼을 클릭하면 Splitsecond 동안 이미지가있는 PictureBox 깜박임이 보입니다.

미리 감사드립니다.

답변

0

아, 이제 내가 잘못한 것을 이해합니다.

여기 내 개정 된 코드입니다. 문제 해결됨.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim newimage As New Bitmap(ImageList1.Images(0).Width, ImageList1.Images(0).Height) 
     Dim g As Graphics = Graphics.FromImage(newimage) 
     g.DrawImage(ImageList1.Images(0), 0, 0) 
     g.DrawImage(ImageList1.Images(1), 0, 0) 
     PictureBox1.Image = newimage 
     g.Dispose()  
End Sub 
0

우선, 동일한 위치에 이미지를 그려서 한 이미지가 다른 이미지를 완전히 덮어 쓸 위험이 있습니다.

그렇다고 그래픽을 그려 보는 것만으로는 충분하지 않습니다. 그림 상자 컨트롤도 무효화해야합니다. 이렇게하면 다시 그려집니다.

현재 프로그램의 조잡한 테스트로 최소화 한 다음 최대화하여 PNG가 있는지 확인할 수 있습니다. 또한 그림 상자를 강제로 다시 그립니다.

+0

답장을 보내 주셔서 감사합니다. 두 번째 이미지가 투명도가있는 오버레이이기 때문에 덮어 쓰게됩니다. 제가 성취하고자하는 일의 예가 여기에 있습니다 : http://www.codeproject.com/KB/cs/Merge_Images_in_C_.aspx 저는 그것을하고 싶습니다. 그러나 파일에 글쓰기 대신에 그것을 보여주고 싶습니다. PictureBox (내 프로그램은 VB.Net C#이 아닙니다). 그림 상자를 무효화하여 무슨 뜻인지 설명해 주시겠습니까? 그리고 최소화/최대화 작업을 시도했지만 아무 일도 없었습니다. – quantum

+0

Easy : Control.Invalidate() 메서드 만 호출하면됩니다. 여기를 참고하십시오 : http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(v=vs.71).aspx 실제 화면으로 그리는 데는 비용이 많이 드는 프로세스이기 때문에 존재합니다. 따라서 drawable 서페이스에 드로잉하는 각 작업의 각 단계를 보여주는 대신에 드로잉 할 수있는 모든 서페이스를 그려서 서페이스를 업데이트하도록 지시합니다. 그건 그렇습니다. * 나는 당신이 당신의 접근 방식으로 모든 길을 잘못 가고 있다고 생각합니다. 모든 그리기 논리를 컨트롤의 ** 페인트 이벤트 **에 배치해야합니다. – Pedery

관련 문제