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