【问题标题】:c# winforms GDI+c# winforms GDI+
【发布时间】:2011-06-07 02:23:14
【问题描述】:

我有一张通过多次平铺同一图形创建的位图。创建位图时,它会根据特定标准为图块着色。

加载位图后,我想为用户提供基于进一步预定义标准更改图块颜色的选项。因此,我是否需要丢弃当前位图,使用新颜色再次生成并附加到面板。或者我可以遍历每个图块的位图并以这种方式更改颜色吗?

谢谢。

【问题讨论】:

    标签: c# winforms gdi+


    【解决方案1】:

    这取决于用户更改磁贴颜色的频率。如果他们不经常这样做,那么生成新位图可能更容易(主要是因为您的代码似乎针对这种情况进行了优化)。

    然而,更好的性能可能是使用 Bitmap.LockBits/UnlockBits 方法获取位图中的像素数据,然后直接操作像素数据。有关如何执行此操作的示例,请参阅有关 Bitmap.LockBits 方法的 MSDN 文档 (http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx)。

    【讨论】:

    • bobpowell.net/lockingbits.htm 如果您想使用“不安全”代码,也值得一试(它会快一点)。
    • 是的,有一些方法可以提高位图上逐像素操作的性能。但没有理由认为这会比简单地重新生成位图更快。
    • 我会说这取决于 GC 承受的内存压力以及需要更改多少图像。如果图像中只有几个位置需要更改,那么您最好更改像素数据;如果更改改变了大部分图像内容,那么位图的重新生成速度可能会更快。
    • 谢谢。是的,这将是整个图像需要改变,所以我会重绘,因为它不需要更新很多次。谢谢。
    【解决方案2】:

    据我所知,您可以通过位图更改颜色的唯一方法是逐个像素地进行,所以我认为您最好的方法是在用户选择新颜色时从头开始生成位图。

    【讨论】:

    • 这是正确的。位图是像素的空间映射阵列。它没有您添加到图像中的“图块”的任何概念。重新着色单个图块中的像素,然后重新创建多图块图形。确保在不再需要之前处理掉以前的位图。
    猜你喜欢
    • 2011-09-17
    • 2020-06-14
    • 2018-02-11
    • 2012-03-06
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2012-08-26
    相关资源
    最近更新 更多