【问题标题】:Access to a single pixel in C#在 C# 中访问单个像素
【发布时间】:2009-01-24 16:25:19
【问题描述】:

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

谢谢, 马尔基。

【问题讨论】:

    标签: c# pixel draw windows


    【解决方案1】:

    使用 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 位图。

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

    EDIT 2:正如其他人所指出的,这仍然很慢。听起来确实需要自己进行 3D 绘图,所以也许SDL.NET(我认为可以使用硬件加速)是要走的路。它甚至有一个(缓慢的)SurfaceControl 可供使用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        不幸的是,硬件方法也会消除投影和阴影,因为这就是硬件的用途。所以我不知道你是否可以使用它......也许在.NET中寻找关于“覆盖”的信息。这就是所有媒体播放器软件显示电影的方式。它肯定比标准 GDI/GDI+ 快得多,而且仍然是 2D 的。或者,也许您可​​以使用 DirectX 做一个棘手的解决方法 - 使用它来绘制您自己定义的 2D 形状。 ;)

        【讨论】:

          【解决方案4】:

          如果您正在做 3d,那么利用当今几乎所有 GPU 提供的硬件加速是有意义的。如果您愿意继续使用特定于 Windows 的 API,那么 DirectX 的 3D API 现在会通过managed wrappers 公开。还有 XNA 工具集,主要是为游戏设计的,但它提供了大量示例,说明如何从 c# 进行 Direct-X 3D 加速绘图。

          【讨论】:

            【解决方案5】:

            如果您需要像素速度,high-speed-graphing-control-for-net-or-mfc 可能会提供一些提示。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-10-01
              • 2014-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多