使用 CreateGraphics() 方法,这应该可以工作:
Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);
要将像素设置为特定颜色,请使用它而不是Color c = b.GetPixel(x,y)
:
b.SetPixel(x, y, c); // where c is a Color
如果您想要一个视口,请放置一个面板或一个 PictureBox(可能使用 Dock: Fill),然后使用:
Bitmap b = new Bitmap(viewport.Width, viewport.Height, viewport.CreateGraphics());
而不是之前使用的第一行。
但从你想做的事情来看,我认为使用 OnPaint 事件会更好:
void pnlViewport_Paint(object sender, PaintEventArgs e) {
if ( e.ClipRectange.Width < 1 || e.ClipRectangle.Height < 1 ) return;
Bitmap b = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height, e.Graphics);
// ...
}
每次控件需要绘制时都会触发此事件。第一行检查正在绘制的区域是否为空 - 这不仅会节省 CPU 时间,而且你的应用程序可能会崩溃 - 你正在让它制作一个 0x0 位图。
EDIT:是的,如果 Dock = DockStyle.Fill,这是可以调整大小的;当窗口大小调整时,控件会扩展以填充空间。然后重新绘制 - 触发事件。
EDIT 2:正如其他人指出的那样,这仍然很慢。听起来确实需要自己做 3D 绘图,所以也许SDL.NET http://cs-sdl.sourceforge.net(我认为可以使用硬件加速)是可行的方法。它甚至还有一个(慢速)SurfaceControl 可供使用。