Как нарисовать закрашенный круг на графический объект в шестнадцатеричном цвете? - PullRequest
3 голосов
/ 04 апреля 2010

Мне нужно нарисовать круг на растровом изображении определенного цвета, заданного в шестнадцатеричном формате. Класс "Кисти" дает только определенные цвета с именами.

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 Earth), и я генерирую много линий с различными цветами Hex. Цвета генерируются математически, и мне нужно сохранить это таким образом, чтобы я мог сделать столько цветов, сколько захочу. Мне нужно сгенерировать иконку PNG для каждой из линий точно такого же цвета.

Ответы [ 3 ]

12 голосов
/ 04 апреля 2010

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 голосов
/ 04 апреля 2010

Используйте 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.
0 голосов
/ 04 апреля 2010

Возможно, вам придется вручную разобрать строку цвета.

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);

Как указывает Аарона, если ваш ARGB находится в таком порядке, существует перегрузка для FromARGB, которая принимает все компоненты в одно целое число:

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