如何用纯色填充位图?
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);
【讨论】:
以上是关于如何用纯色填充位图?的主要内容,如果未能解决你的问题,请参考以下文章