Как нарисовать пронумерованные круги и сохранить их в файлах на C#
Иногда мне нужно рисовать пронумерованные круги для размещения на изображениях, которые я буду использовать в книгах или статьях. Эта программа позволяет мне рисовать круги, которые выглядят красиво, которые плавно затенены и имеют прозрачный фон.
Метод MakeNumberBitmap, показанный в следующем коде, выполняет большую часть интересной работы рисования пронумерованных кругов.
// Сделайте растровое изображение, содержащее указанный текст.
private Bitmap MakeNumberBitmap(int width, Color bg_color,
    Color fg_color, bool draw_border, Font fg_font, string txt)
{
    // Размер растрового изображения.
    Bitmap bm = new Bitmap(width, width);
    using (Graphics gr = Graphics.FromImage(bm))
    {
        gr.SmoothingMode = SmoothingMode.AntiAlias;
        gr.TextRenderingHint = TextRenderingHint.AntiAlias;
        // Сделать фон прозрачным.
        gr.Clear(Color.Transparent);
        // Заполните фон.
        Rectangle rect = new Rectangle(2, 2, width - 4, width - 4);
        using (LinearGradientBrush bg_brush =
            new LinearGradientBrush(rect, Color.White,
            bg_color, LinearGradientMode.BackwardDiagonal))
        {
            gr.FillEllipse(bg_brush, rect);
        }
        // Обозначим фон.
        if (draw_border)
        {
            using (Pen bg_pen = new Pen(bg_color))
            {
                gr.DrawEllipse(bg_pen, rect);
            }
        }
        // Нарисуем образец текста.
        using (StringFormat string_format = new StringFormat())
        {
            string_format.Alignment = StringAlignment.Center;
            string_format.LineAlignment = StringAlignment.Center;
            using (Brush fg_brush = new SolidBrush(fg_color))
            {
                gr.DrawString(txt, fg_font, fg_brush,
                    rect, string_format);
            }
        }
    }
    return bm;
}
Сначала код создает растровое изображение нужного размера и делает объект Graphics для рисования на нем. Он устанавливает SmoothingMode объект для создания плавных линий и устанавливает TextRenderingHint, чтобы сделать гладкий текст. Затем он очищает растровое изображение прозрачным цветом.
Далее код заполняет круг с фоном, который оттеняет белый в верхнем правом углу желаемый фоновый цвет в левом нижнем углу. Если параметр draw_border true, код рисует контур вокруг круга.
Наконец, код рисует текст, который он должен отображать (число в этом примере), центрированное по растровому изображению, и возвращает растровое изображение.
В примере есть несколько обработчиков событий, которые заставляют его перерисовывать образец, если какой-либо из параметров чертежа изменяется, но самый интересный оставшийся фрагмент кода сохраняет серию изображений в файлах.
// Создаем файлы.
private void btnMakeFiles_Click(object sender, EventArgs e)
{
    // Создаем файлы.
    for (decimal i = nudMin.Value; i <= nudMax.Value; i++)
    {
        // Создаем файл.
        Bitmap bm = MakeNumberBitmap((int)nudWidth.Value,
            picBackground.BackColor, picForeground.BackColor,
            chkBorder.Checked, lblFontSample.Font,
            i.ToString());
        // Сохраним файл.
        bm.Save("Number" + i.ToString() + ".png", ImageFormat.Png);
    }
    MessageBox.Show("Done", "Done", MessageBoxButtons.OK,
        MessageBoxIcon.Information);
}
														
	
								
								
													