一些背景故事:我目前正在尝试使用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");
当我打开图像时,它都是透明的。有谁知道这是为什么?
答案 0 :(得分:0)
执行此操作时:
bmp = new Bitmap(w2, h2, gfx);
您实际上并没有创建Graphics
对象正在使用的位图副本,只是使用其规范来创建一个新的空对象。图形直接操作位图。你不需要从它“取回”它。摆脱那条线和之前的线,然后保存bmp2,它应该可以工作。
答案 1 :(得分:0)
在第8行,您将bmp
绘制到bmp2
上。之后使用gfx
执行的任何操作仍会影响bmp2
。
在第9行,您创建了一个新位图并将gfx
分配给位图,这意味着您将bmp
与gfx
一起绘制(无论如何你都没有)。然后,您继续保存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;
}