Как сохранить нарисованное изображение в формате bmp - C#
Формулировка задачи:
Моя программа рисует круговые диаграммы. Есть поля для ввода названия диаграммы/количества секторов в ней/данных диаграммы(название предмета и его количество). Все эти данные помещаются в ListBox. Трудность состоит в том, чтобы сохранить нарисованную программой диаграмму в формате .bmp. Код создания диаграммы:
//создание круговой диаграммы
private void начертитьДиагToolMenu_Click(object sender, EventArgs e)
{
panel1.Visible = false;
try
{
//считываем заголовок диаграммы
header = Convert.ToString(listBox1.Items[0]);
//считывание количества секторов и инициализация массивов
N = Convert.ToInt16(listBox1.Items[1]);
dat = new double[N];
p = new double[N];
title = new string[N];
//читаем данные
int i = 0;
for (int index = 2; index < listBox1.Items.Count-1; index++)
{
title[i] = Convert.ToString(listBox1.Items[index]);
dat[i++] = Convert.ToDouble(listBox1.Items[++index]);
}
//процедура обработки рисования диаграммы
this.Paint += new PaintEventHandler(Diagram);
double sum = 0;
int j = 0;
//вычислить сумму
for (j = 0; j < N; j++)
sum += dat[j];
//вычислить долю каждой категории
for (j = 0; j < N; j++)
p[j] = (double)(dat[j] / sum);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Диаграмма", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void Diagram(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Font hFont = new Font("Tahoma", 16);
int w = (int)g.MeasureString(header, hFont).Width;
int x = (this.ClientSize.Width - w) / 2 + 170;
g.DrawString(header, hFont, System.Drawing.Brushes.Black, x, 30);
Font lFont = new Font("Tahoma", 9);
int diam = ClientSize.Height - 180;
int x0 = 300;
int y0 = 90;
int lx = 310 + diam;
int ly = y0 + (diam - N * 20 + 10) / 2;
int swe;
Brush fBrush = Brushes.White;
// начальная точка дуги сектора
int sta = -90;
// рисуем диаграмму
for (int i = 0; i < N; i++)
{
// длинна дуги
swe = (int)(360 * p[i]);
// задать цвет сектора
switch (i)
{
//выбор цвета сектора
}
// из-за округления возможна ситуация
// при которой будет промежуток между
// последним и первым секторами
if (i == N - 1)
{
// последний сектор
swe = 270 - sta;
}
// рисуем сектор
g.FillPie(fBrush, x0, y0, diam, diam, sta, swe);
// рисуем границу сектора
g.DrawPie(System.Drawing.Pens.Black, x0, y0, diam, diam, sta, swe);
// прямоугольник легенда
g.FillRectangle(fBrush,
lx, ly + i * 20, 20, 10);
g.DrawRectangle(System.Drawing.Pens.Black,
lx, ly + i * 20, 20, 10);
// подпись
g.DrawString(title[i] + " - " + p[i].ToString("P"), lFont, System.Drawing.Brushes.Black,
lx + 24, ly + i * 20 - 3);
// начальная точка дуги для следующего сектора
sta += swe;
начертитьДиагToolMenu.Enabled = false;
}
}Решение задачи: «Как сохранить нарисованное изображение в формате bmp»
textual
Листинг программы
private void начертитьДиагToolMenu_Click(object sender, EventArgs e)
{
//процедура обработки рисования диаграммы
this.pictureBox1.Paint += new PaintEventHandler(Diagram);
pictureBox1.Invalidate();
}
void Diagram(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap((int)415, (int)355);
pictureBox1.Image = bmp;
pictureBox1.Image = (Image)new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage (pictureBox1.Image);
Font hFont = new Font("Tahoma", 16);
g.DrawString(header, hFont, System.Drawing.Brushes.Black, 100, 30);
Font lFont = new Font("Tahoma", 9);
int diam = 100;//(int)(pictureBox1.ClientSize.Width) -150;
int x0 = 60;
int y0 = 60;
int lx = 200 + diam;
int ly = y0 + (diam - N * 20 + 10) / 2;
//дальше идет прорисовка диаграммы
}