【问题标题】:How can I edit individual pixels in a window?如何编辑窗口中的单个像素?
【发布时间】:2010-06-25 19:10:25
【问题描述】:

我想创建一个简单的视频渲染器来玩,并做一些事情,比如创建一个移动操作系统,只是为了好玩。我父亲告诉我,在第一台计算机中,你会编辑一个特定的内存地址,然后屏幕就会更新。我想在 Windows 的窗口中模拟这个。有什么办法可以用 C# 做到这一点?

【问题讨论】:

    标签: c# memory screen pixels


    【解决方案1】:

    以前这样做是因为您可以直接访问视频缓冲区。这通常不适用于当今的系统,因为视频内存由视频驱动程序和操作系统管理。此外,视频内存缓冲区和显示的内容实际上不再存在 1:1 映射。有了如此多的可用内存,就有可能拥有多个缓冲区并在它们之间切换。当前显示的缓冲区称为“前缓冲区”,其他未显示的缓冲区称为“后缓冲区”(有关更多信息,请参阅https://en.wikipedia.org/wiki/Multiple_buffering)。我们通常写入后台缓冲区,然后让视频系统为我们更新前台缓冲区。这提供了流畅的更新,因为视频驱动程序会将更新与显示器的扫描速率同步。

    要使用 C# 写入后台缓冲区,我最喜欢的技术是使用 WPF WritableBitmap。我还使用System.Drawing.Bitmap 通过LockBits 向屏幕写入像素来更新屏幕。

    【讨论】:

    • 虽然我确信这是一个更好的解决方案,但我并不完全理解代码并且了解自己,我会用非托管代码搞砸大时间:D
    • @Daniel - 这不是非托管代码...不安全,当然,但实际上没有其他方法可以让它变得更快。您可以使用 GetPixel/SetPixel,但不能很快。 ;)
    【解决方案2】:

    这是一个功能齐全的主题,超出了这个答案的范围(它不适合,并不是说我不会在几个小时内喋喋不休:-) ..但这应该让你开始用 C# 绘图

    http://www.geekpedia.com/tutorial50_Drawing-with-Csharp.html

    从过去直接内存操作的时代开始,事情已经有了一些变化……尽管一切仍然与像素相关。

    编辑:哦,如果您遇到闪烁问题并卡住了,请给我写信,我会发给您一个 DoubleBuffered 面板供您绘画。

    【讨论】:

    • 在 WinForms > v2.0 中,可以通过设置 DoubleBuffered 属性来开启双缓冲:msdn.microsoft.com/en-us/library/…
    • 但不在面板或任何托管控件上:-D 继续尝试。它会主动忽略您的尝试,因为 DoubleBuffered 属性是受保护的值。
    • 对。我想我忘记了,因为将面板子类化并在构造函数中设置该属性非常容易。无论如何,DoubleBuffered 只是将控件样式设置为 ControlStyles.OptimizedDoubleBuffer | 的快捷方式。 ControlStyles.AllPaintingInWmPaint,因此您也可以使用该值调用 SetStyle()。
    • 谢谢!我会坚持画矩形,要简单得多(我对 c# 还是很陌生)
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2014-06-07
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多