C# 在C语言中访问单个像素#

C# 在C语言中访问单个像素#,c#,pixel,draw,windows,C#,Pixel,Draw,Windows,我现在正在做一个学校项目。它是一个3D编辑软件(就像一个非常精简的Maya版本)。我必须使用“Windows应用程序项目”用C#编写它。 我打算自己实现所有3D的东西,从投影到着色。 我的问题是,如何在C#windows应用程序中直接访问单个像素? 我知道我将在窗口中有一个主视图端口。但我还没有决定如何制作。是否有一个内置的对象,我可以使用它来定义视图端口的边界,然后分别绘制每个像素? (我只是在黑暗中拍摄,我对C不太了解。我主要用C编程) 谢谢, Malki.Christian Graus在w

我现在正在做一个学校项目。它是一个3D编辑软件(就像一个非常精简的Maya版本)。我必须使用“Windows应用程序项目”用C#编写它。 我打算自己实现所有3D的东西,从投影到着色。 我的问题是,如何在C#windows应用程序中直接访问单个像素? 我知道我将在窗口中有一个主视图端口。但我还没有决定如何制作。是否有一个内置的对象,我可以使用它来定义视图端口的边界,然后分别绘制每个像素? (我只是在黑暗中拍摄,我对C不太了解。我主要用C编程)

谢谢,
Malki.

Christian Graus在www.CodeProject.com上有几篇很好的图形处理文章。他们应该回答您的问题。

使用CreateGraphics()方法,应该可以:

Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);
要将像素设置为特定颜色,请使用此选项而不是
Color c=b.GetPixel(x,y)

如果需要视口,请放置面板或图片盒(可能带有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);
    // ...
}
void pnlViewport_Paint(对象发送方,PaintEventArgs e){
如果(e.ClipRectange.Width<1 | | e.ClipRectange.Height<1)返回;
位图b=新位图(e.ClipRectangle.Width、e.ClipRectangle.Height、e.Graphics);
// ...
}
每次需要绘制控件时,此事件都会激发。第一行检查正在绘制的区域是否为空-这不仅会节省CPU时间,而且应用程序可能会崩溃-您正在使其生成0x0位图

编辑:是的,如果Dock=DockStyle.Fill,这是可调整大小的;当窗口调整大小时,控件将展开以填充空间。然后重新绘制-触发事件


编辑2:正如其他人指出的那样,这仍然很慢。这听起来像是一个要求自己做3D绘图,所以也许(我认为可以使用硬件加速)是一个方向。它甚至有一个(缓慢的)表面控件可供使用。

如果你在做3d,那么利用当今几乎所有GPU提供的硬件加速将是有意义的。如果您愿意继续使用windows特定的API,那么DirectX的3D API将通过now公开。此外,该工具集主要是针对游戏设计的,但它提供了大量的示例,说明如何从c#中进行Direct-X 3D加速绘图。

3D编辑器应用程序不仅需要在屏幕上绘图,还需要非常快地完成。NET中的标准方法是使用位图和图形类,如person-b所述。但这将是缓慢的。通过使用Bitmap.LockBits()和巧妙的优化,您可以提高速度,但总而言之,我怀疑您是否仍能获得所需的性能。您将消耗掉所有的CPU,并且仍然会被限制在10-20 FPS以下(这个数字是一个猜测)。硬件加速才是真正的出路shuggycouk具有正确方向的链接


不幸的是,硬件方法也会删除投影和着色,因为这就是硬件的用途。所以我不知道你能不能用这个。。。也许可以在.NET中查找有关“覆盖”的信息。这就是所有媒体播放器软件显示电影的方式。它肯定比标准GDI/GDI+快得多,而且仍然是2D。或者你可以用DirectX做一个棘手的解决办法——用它来画你自己定义的二维形状

如果您需要像素速度,可以提供一些提示

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);
    // ...
}