C# 图形DrawImage在转换为位图后是完全透明的

C# 图形DrawImage在转换为位图后是完全透明的,c#,graphics,bitmap,C#,Graphics,Bitmap,一点背景故事:我目前正在尝试用OpenTK加载纹理,因此我正在寻找2的下一个幂(5121024等),并创建一个具有该大小的新位图,并在上面绘制原始位图: 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); G

一点背景故事:我目前正在尝试用OpenTK加载纹理,因此我正在寻找2的下一个幂(5121024等),并创建一个具有该大小的新位图,并在上面绘制原始位图:

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");
但当我打开图像时,它是透明的。有人知道这是为什么吗?

当您这样做时:

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

实际上,您并不是在创建
Graphics
对象正在使用的位图的副本,而是在使用其规范创建一个新的空位图。图形直接操纵位图。你不需要从中“得到”它。去掉那一行和前面的那一行,并保存bmp2,它应该会工作。

在第8行,您将
bmp
绘制到
bmp2
上。之后使用
gfx
所做的任何操作仍然会影响
bmp2

在第9行,您创建了一个新位图,并将
gfx
指定给位图,这意味着您将使用
gfx
绘制
bmp
(您无论如何都没有这样做)。然后继续保存
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#版本:


你能详细介绍一下透明度吗?谢谢,我不知道bmp2和gfx会有联系
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;
}