【问题标题】:How do I fill a bitmap with a solid color?如何用纯色填充位图?
【发布时间】:2010-12-15 18:20:24
【问题描述】:

我需要使用独特的 RGB 颜色创建 24 位位图(分辨率 100x100 像素)并将生成的图像保存到磁盘。我目前使用SetPixel函数,但速度极慢。

Bitmap Bmp = new Bitmap(width, height);
//...
//...
Bmp.SetPixel(x,y,Color.FromARGB(redvalue, greenvalue, bluevalue));

有没有比SetPixel 更快的方法?提前致谢。

【问题讨论】:

    标签: c# image bitmap


    【解决方案1】:

    创建大小为 s(高度、宽度)和颜色为 c 的位图对象 bmp。

    bmp = CreateBmp(c, s);
    

    现在返回位图的 CreateBmp 方法:

    Bitmap CreateBmp(Color c, Size s)
    {
        Bitmap temp =new Bitmap(1, 1);
        temp.SetPixel(0, 0, c);
        return new Bitmap(temp, s);
    }
    

    【讨论】:

      【解决方案2】:
      Bitmap bmp = new Bitmap(width, height);
      Graphics g = Graphics.FromImage(bmp);
      g.Clear(Color.Green);
      

      【讨论】:

      • 您能否向我们提供与您的答案相关的更多详细信息。谢谢
      • 这是最好的答案。根据我的经验,当您清除整个图像时,Clear 比调用 FillRectangle 更快。
      • Graphics clear 方法清除整个绘图表面并用指定的背景颜色填充它。不需要手动填充,这是clear方法的一个选项。看msdn的解释。
      • 如果您阅读本文,请始终使用using 保护使用位图或图形的任何操作,否则对象将无法正确处理。
      【解决方案3】:

      这应该可以满足您的需要。它将用指定的颜色填充整个位图。

      Bitmap Bmp = new Bitmap(width, height);
      using (Graphics gfx = Graphics.FromImage(Bmp))
      using (SolidBrush brush = new SolidBrush(Color.FromArgb(redvalue, greenvalue, bluevalue)))
      {
          gfx.FillRectangle(brush, 0, 0, width, height);
      }
      

      【讨论】:

      • 这显示了如何从另一个位图制作位图。
      • @SanuelJackson 所以你否决了这个答案,因为它回答了 OP 的实际问题,而不是他问题的标题?
      • 如果加上Bitmap Bmp = new Bitmap(width, height);,那就对了。我可以在问题中看到它还有一个代码示例,说明当前正在做什么以从头开始创建某些东西。或多或少厌倦了在所有“从头开始”的答案中看到 Graphics.FromImage()。理想情况下,希望从零开始从 Graphics 中看到新的位图。
      • @SanuelJackson 很公平,我想,虽然没有人问如何从头开始创建一个 - OP 已经知道如何做到这一点,他真正的问题是如何用纯色填充位图。也许您可以通过建议的编辑将注意力集中在改进问题标题上。或者,如果您知道如何修正答案,请继续进行编辑。
      • 改变了我的投票。感谢您更新此内容。我尽量不编辑旧的帖子(在涉及死灵编辑时会害羞)。对于那些搜索这个概念的人来说绝对有帮助,因为这篇文章现在在谷歌搜索中显示得相当高:)
      【解决方案4】:

      总是使用区域(矩形)比使用单个像素快得多。

      【讨论】:

        【解决方案5】:

        你在这里被宠坏了:-)

        使用 GDI+ 的替代方法是使用 WPF(请参阅 RenderTargetBitmap.Render。)

        另见this question。

        【讨论】:

          【解决方案6】:

          我建议查看 GD 库。

          我很确定有一个 c# 库。 http://www.boutell.com/gd/

          【讨论】:

            【解决方案7】:

            您可以使用LockBits 来加速写入像素(指针访问而不是每个像素的方法调用)。

            【讨论】:

              【解决方案8】:

              这取决于您要完成的工作,但通常您会通过获取图形对象然后绘制到它来使用 GDI+:

              Graphics g = Graphics.FromImage(bitmap); 
              

              其实是个大课题,这里有一些初学者教程:GDI+ Tutorials

              这是教程中关于使用渐变填充绘制矩形的 sn-p。

              Rectangle rect = new Rectangle(50, 30, 100, 100); 
              LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red, Color.Yellow, LinearGradientMode.BackwardDiagonal); 
              g.FillRectangle(lBrush, rect); 
              

              【讨论】:

                猜你喜欢
                • 2011-05-19
                • 2010-10-29
                • 2011-10-20
                • 2011-09-08
                • 2012-06-22
                • 2013-01-12
                • 2011-03-17
                • 2019-12-26
                • 1970-01-01
                相关资源
                最近更新 更多