Как нарисовать пронумерованные круги и сохранить их в файлах на 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);
}
