如何用纯色填充位图?

Posted

技术标签:

【中文标题】如何用纯色填充位图?【英文标题】: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 更快的方法?提前致谢。

【问题讨论】:

【参考方案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); 

【讨论】:

以上是关于如何用纯色填充位图?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 用颜色填充位图

Redis实践 -位图

如何将调色板应用于位图

在 Android 中动态且顺序地用颜色填充图像视图或位图

创建具有给定尺寸的新位图并填充给定颜色

ActionScript / Flash - 以编程方式位图填充 IDE 绘制的矢量?