我对Bitmap类有疑问。如果要在位图上设置大量像素,则可以使用SetPixel
方法,但速度非常慢。有很多关于如何使用LockBits
方法等加快速度的文档,所以我创建了一个方法:SetFastPixel
来加快它的速度。
然而,我真的对此感到困惑:为什么微软不会将SetPixel()的实现更改为更快的实现?换句话说,使用{是否有优势? {1}}而不是SetPixel
方法?
答案 0 :(得分:6)
SetFastPixel
可能不起作用的情况:
SetPixel
处理RGB到调色板索引映射)LockBits
) SetPixel
旨在处理上述所有问题,但代价是速度慢。如果您愿意牺牲上述某些要点,或者您很乐意在应用程序中处理它们,那么您就可以通过LockBits
绘制图像。
答案 1 :(得分:4)
要使处理特定位图格式的实现很容易,但是图像可以存储在内存中的方式有很多种,因此实现处理所有格式的解决方案要复杂得多。
例如,位图可以在存储器中正面朝上或颠倒存储,在线之间有或没有填充,每个像素有许多不同的位数。
实现这项工作只是为了让方法更快一点。一次设置一个像素本身就很慢,所以如果你想要速度,你不应该使用那个方法。
答案 2 :(得分:1)
无论如何实现,调用设置单个像素的方法本质上都很慢,因为对于每个调用,您必须计算和检查索引,转换像素格式等。
答案 3 :(得分:1)
Direct3D就是为此而创建的。尽管它的名字,它仍然可以做原始2D像素操作。一般来说,你这样做:
是的,它比GDI复杂得多,但它与硬件和驱动程序紧密耦合,因此您可以准确控制渲染的位置以及它如何显示在屏幕上。你再也不想用GDI做任何高性能的图形了。
答案 4 :(得分:0)
他们不在乎,因为大多数人不会那样使用它。 C#通常不用于渲染视频 - 如果你需要这样的东西,那么有更快的替代品。
答案 5 :(得分:0)
System.Drawing中的类只是GDI+中使用的C ++类的一个薄层。微软不打算公开一个通用接口(System.Drawing& GDI +),并且有两个应该以不同方式执行相同操作的类。