在 C# 中访问单个像素

2023-12-24

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

谢谢, 马尔基。


使用 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 可供使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中访问单个像素 的相关文章

随机推荐