2010-10-29 33 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,它​​应该可以工作。