2011-01-05 107 views
2

我在我的應用程序中有兩個(實際上很多)PNG(.png)圖像。這兩處都有透明區域。使用.NET將兩個PNG圖像組合成一個圖像

我想在我的應用程序中將兩個圖像合併起來,並將結果顯示在圖片框中。稍後我想通過按鈕保存結果。

到目前爲止,我設法找到兩個圖像並將它們結合起來,但它似乎透明的東西不會工作。我的意思是,如果您將一張圖片放在另一張圖片上,則只有頂部圖片可見,因爲顯然圖片的背景是純白色的框。它不是。

這裏有點我的代碼:

Dim Result As New Bitmap(96, 128) 
    Dim g As Graphics = Graphics.FromImage(Result) 
    Dim Name As String 
    For Each Name In BasesCheckList.CheckedItems 
     Dim Layer As New Bitmap(resourcesPath & "Bases\" & Name) 
     For x = 0 To Layer.Width - 1 
      For y = 0 To Layer.Height - 1 
       Result.SetPixel(x, y, Layer.GetPixel(x, y)) 
      Next 
     Next 
     Layer = Nothing 
    Next 

resourcesPath是通向我的資源文件夾中。 Bases是其中的一個文件夾。而Name是圖片的名稱。

回答

1

我相信你的縮放問題可能與具有不同DPI的圖像有關。如果是這種情況,你真的想要DrawImage(),因爲它會重新調整圖像,以便它們匹配圖形對象的DPI。一個警告:如果你沒有提供尺寸DrawImage()它與DrawImageUnscaled()出於某種原因做了同樣的事情。

Dim result As New Bitmap(96, 128) 

Dim directoryName As String = String.Format("{0}Bases", resourcesPath) 
Using g As Graphics = Graphics.FromImage(result) 
    For Each imageName As String In BasesCheckList.CheckedItems 
     Dim fileName As String = IO.Path.Combine(directoryName, imageName) 
     Using layer As New Bitmap(fileName) 
      g.DrawImage(layer, 0, 0, 96, 128) 
     End Using 
    Next 
End Using 

更詳細的討論是在Xtreme VB Talk論壇上,您決定交叉發佈。不要在將來這樣做,因爲它會增加電線穿過的可能性,每個人都會浪費時間。

3

問題是您正在嘗試手動完成此操作。別。有很多用於繪製圖像的庫例程,他們知道如何正確處理透明度。

Dim Result As New Bitmap(96, 128) 
Dim g As Graphics = Graphics.FromImage(Result) 
Dim Name As String 
For Each Name In BasesCheckList.CheckedItems 
    Dim Layer As New Bitmap(resourcesPath & "Bases\" & Name) 
    g.DrawImageUnscaled(Layer, 0, 0); 
    Layer = Nothing 
Next 
+0

謝謝,除了一件事之外,它似乎可以工作:我用於預覽所得圖像的圖片框似乎顯示圖像的「調整大小」版本。最後,我用PictureBox.Image = Result ....我不明白爲什麼圖像顯示那樣... – Voldemort 2011-01-05 22:22:06

+0

@Omega:您的圖像與您正在寫入的位圖大小相同嗎? – 2011-01-05 22:24:48

+0

是的,位圖「結果」是96x128,我用來測試的兩個位圖也是96x128。然而,圖片框似乎放大了2的結果... – Voldemort 2011-01-05 22:37:20

相關問題