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