2011-01-17 80 views
0

我想用GDI +合併兩個PNG的透明度,我已經存儲在ImageList中,然後在PictureBox中顯示它。我的PictureBox大小,第一個圖像大小和第二個圖像大小都是相同的。我認爲這會很簡單,但下面的代碼不起作用,我不知道爲什麼。我已經搜索,但我找不到任何代碼片段專門處理PictureBoxes。將2個透明圖像合併到一個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 

有誰知道我缺少的是什麼?在我點擊按鈕的那一刻,我看到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#)。 你能否通過使picturebox失效來解釋你的意思? 我嘗試了最小化/最大化的事情,但沒有發生任何事情。 – quantum

+0

簡單:只需調用Control.Invalidate()方法即可。看到這裏:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(v=vs.71).aspx它存在,因爲繪製到實際屏幕是一個昂貴的過程。因此,您不必顯示繪圖表面上繪製的每個東西的每一步,而是繪製所有東西並告訴曲面自行更新。這就是說,*我認爲你的方法會一起走錯路。您應該將所有繪圖邏輯放置在控件的** Paint-event **中。 – Pedery