【问题标题】:How do I draw a filled circle onto a graphics object in a hexadecimal colour?如何以十六进制颜色在图形对象上绘制实心圆?
【发布时间】:2011-02-04 04:42:27
【问题描述】:

我需要以十六进制给出的特定颜色在位图上画一个圆圈。 “画笔”类只给出带有名称的特定颜色。

Bitmap bitmap = new Bitmap(20, 20);
Graphics g = Graphics.FromImage(bitmap);
g.FillEllipse(Brushes.AliceBlue, 0, 0, 19, 19); //The input parameter is not a Hex
//g.FillEllipse(new Brush("#ff00ffff"), 0, 0, 19, 19); <<This is the kind of think I need.

有没有办法做到这一点?

确切的问题: 我正在生成 KML(用于 Google 地球),并且正在生成许多具有不同十六进制颜色的线条。颜色是用数学方法生成的,我需要保持这种状态,这样我就可以制作任意数量的颜色。我需要为每条颜色完全相同的线条生成一个 PNG 图标。

【问题讨论】:

  • 我认为这段代码只是一个示例,但如果它与您的生产代码有任何相似之处,那么您应该知道它存在资源泄漏。您需要处理 GraphicsBitmap 对象。

标签: c# colors bitmap rgb


【解决方案1】:

ColorTranslator.FromHtml会给你对应的System.Drawing.Color:

using (Bitmap bitmap = new Bitmap(20, 20))
{
   using (Graphics g = Graphics.FromImage(bitmap))
   {
      using (Brush b = new SolidBrush(ColorTranslator.FromHtml("#ff00ffff")))
      {
         g.FillEllipse(b, 0, 0, 19, 19);
      }
   }
}

【讨论】:

  • 另外,记得释放所有图形资源。
【解决方案2】:

使用由适当的Color 构造的SolidBrush

例子:

Color color = Color.FromArgb(0x00,0xff,0xff,0x00); // Channels: Alpha, Red, Green, Blue.
SolidBrush brush = new SolidBrush(color);
// Use this brush in your calls to FillElipse.

【讨论】:

    【解决方案3】:

    您可能必须手动解析颜色字符串。

    string colorSpec = "#ff00ffff";
    byte alpha = byte.Parse(colorSpec.Substring(1,2), System.Globalization.NumberStyles.HexNumber);
    byte red = byte.Parse(colorSpec.Substring(3, 2),System.Globalization.NumberStyles.HexNumber);
    byte green = byte.Parse(colorSpec.Substring(5, 2), System.Globalization.NumberStyles.HexNumber);
    byte blue = byte.Parse(colorSpec.Substring(7, 2), System.Globalization.NumberStyles.HexNumber);
    Color fillColor = Color.FromArgb(alpha, red, green, blue);
    

    正如 Aaronaught 所指出的,如果您的 ARGB 处于该顺序,则 FromARGB 存在一个重载,它接受一个整数中的所有组件:

    int argb = int.Parse(colorSpec.Substring(1), System.Globalization.NumberStyles.HexNumber);
    Color fillColor = Color.FromArgb(argb);
    

    【讨论】:

    • Color.FromArgb 有一个采用int 的重载,因此无需解析单个字节;一个int.Parse 就足够了。
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2014-07-13
    • 1970-01-01
    • 2019-10-29
    • 2011-03-11
    • 2016-12-27
    相关资源
    最近更新 更多