2010-10-29 30 views
0

有點背景故事:我目前正在嘗試使用OpenTK加載紋理,因此我正在尋找2(512,1024等)的下一個功能,並創建一個新的位圖該大小和繪製原始位圖:圖形DrawImage轉換爲位圖後全透明

Bitmap bmp = new Bitmap(filename); 
width = bmp.Width; 
height = bmp.Height; 
int w2 = (int)PowerOf2(width); 
int h2 = (int)PowerOf2(height); 
Bitmap bmp2 = new Bitmap(w2, h2); 
Graphics gfx = Graphics.FromImage(bmp2); 
gfx.DrawImage(bmp, new Point(0,0));  
bmp = new Bitmap(w2, h2, gfx); 
bmp.Save("save.bmp"); 

雖然我打開圖像時,它都是透明的。有人知道爲什麼嗎?

+0

您可以詳細瞭解透明度嗎? – 2010-10-29 15:31:07

回答

0

在第8行,您將bmp劃到bmp2。你之後做的任何事情都會影響bmp2

在第9行,您創建了一個新的位圖和分配gfx位圖,這意味着你會畫到bmpgfx(你沒有反正)。然後,您繼續保存bmp,它爲您提供了一個空的或者如您所描述的「透明」圖像。

如果你想你的形象的規模擴大一倍,你可能會考慮修改你的代碼這種東西:

Private Sub DrawNewImage() 
    Dim bmp = New Bitmap("C:\Path\to\file.bmp") 
    Dim Width = bmp.Width 
    Dim Height = bmp.Height 
    Dim w2 As Integer = PowerOf2(Width) 
    Dim h2 As Integer = PowerOf2(Height) 

    Dim bmp2 = New Bitmap(w2, h2) 
    Dim gfx = Graphics.FromImage(bmp2) 

    gfx.DrawImage(bmp, 0, 0, w2, h2) 
    bmp2.Save("C:\Path\to\saved\file.bmp") 
End Sub 

Private Function PowerOf2(ByVal value As Integer) As Integer 
    Return value * value 
End Function 

,或者你可以嘗試轉換後的C#版本:

private void DrawNewImage() 
{ 
    Bitmap bmp = new Bitmap("C:\\Path\\to\\file.bmp"); 
    int Width = bmp.Width; 
    int Height = bmp.Height; 
    int w2 = PowerOf2(Width); 
    int h2 = PowerOf2(Height); 

    Bitmap bmp2 = new Bitmap(w2, h2); 
    Graphics gfx = Graphics.FromImage(bmp2); 

    gfx.DrawImage(bmp, 0, 0, w2, h2); 
    bmp2.Save("C:\\Path\\to\\saved\\file.bmp"); 
} 

private int PowerOf2(int value) 
{ 
    return value * value; 
} 
+0

謝謝,我不知道bmp2和gfx會被鏈接 – matio2matio 2010-10-29 15:37:03

0

當你這樣做:

bmp = new Bitmap(w2, h2, gfx); 

你實際上並沒有創造你的Graphics對象是使用,只是用它的規範來創建一個新的空一個位圖的副本。圖形直接操縱位圖。你不需要從中「獲得」它。擺脫那條線和之前的那條線,並且保存bmp2,它​​應該可以工作。