转换为位图后,图形DrawImage全部透明

时间:2010-10-29 15:19:00

标签: c# graphics bitmap

一些背景故事:我目前正在尝试使用OpenTK加载纹理,所以我找到了下一个2的幂(512,1024等)并创建了一个具有该大小的新位图并绘制了原始位图:

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");

当我打开图像时,它都是透明的。有谁知道这是为什么?

2 个答案:

答案 0 :(得分:0)

执行此操作时:

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

您实际上并没有创建Graphics对象正在使用的位图副本,只是使用其规范来创建一个新的空对象。图形直接操作位图。你不需要从它“取回”它。摆脱那条线和之前的线,然后保存bmp2,它​​应该可以工作。

答案 1 :(得分:0)

在第8行,您将bmp绘制到bmp2上。之后使用gfx执行的任何操作仍会影响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;
}