C #: как я могу сохранить диаграмму и текстовое поле в одном изображении (например, * .png)? - PullRequest
0 голосов
/ 28 февраля 2019

Решение: Использовал DrawtoBitmap, чтобы нарисовать диаграмму и текстовое поле отдельно на одном растровом изображении, и сохранил его с помощью bitmap.save.

Описание проблемы: у меня есть код, который анализирует данные и рисует графики, сохраняя их в виде.png файлЯ хочу добавить текст в файл .png вместе с графиком диаграммы.Можно ли объединить диаграмму и текстовое поле в одно изображение и сохранить его как один файл?Пожалуйста, график image.png, который у меня есть до сих пор, и как я хочу, чтобы мой текст был на том же изображении.

enter image description here

1 Ответ

0 голосов
/ 28 февраля 2019

У вас есть много вариантов:

  • Вы можете сделать снимок экрана

  • Вы можете Save Chart 's Изображение и DrawToBitmap TextBox, а затем нарисуйте 2-е изображение поверх первого.

  • Вы можете Save Изображение Chart и DrawString the TextBox.Text поверх изображения

  • Вы можете добавить TextBox к Chart.Controls (в коде!) И затем использовать DrawToBitmap, чтобы диаграмма нарисовала оба в одно изображение.

  • Вы можете DrawString текст в событии Chart.xxxPaint и использовать DrawToBitmap

Следующие два параметра делают текстподлинная часть таблицы:

  • (рекомендуется :) вы можете использовать TextAnnotation или RectangleAnnotation: поместите его в подходящее место на Chart и используйте, возможно,TextBox.TextChanged событие для копирования текста в TextAnnotation.Это наиболее «похожий на график» вариант, и, скорее всего, я бы это сделал.

  • Вы можете даже заменить TextBox на редактируемый TextAnnotation..!

Не видя диаграмму и не зная цели в деталях, трудно рекомендовать, в какую сторону идти.

Все Annotations немного сложны для размещения, но будут перемещаться при изменении размера диаграммы и даже будут сохранены в xml при сериализации.Стоит учиться!

Обновление:

Вот пример, который помещает текст прямо под Legend, предполагая, что он находится в верхней правой позиции по умолчанию.

Обратите внимание , что ElementPosition содержит и местоположение, и размер, и что все числа указаны в процентах от контейнера, в случае Chart ..:

Сначала мы объявляем это глобально;мы также можем получить к нему доступ через коллекцию chart.Annotions, но я ленивый;Также обратите внимание, что я использую RectangleAnnotation, который совпадает с TextAnnotation, но с возможностью выбора цвета и рамки сзади::

 RectangleAnnotation RA = null;

Для его создания я использую этот код:

RA = new RectangleAnnotation();
RA.BackColor = Color.LightPink;
RA.Alignment = ContentAlignment.TopLeft;
chart.Annotations.Add(RA);
RaPos();

Для его размещения я использую функцию:

void RaPos()
{
    if (RA == null) return;
    ElementPosition LP = chart.Legends[0].Position;
    RA.X = LP.X;
    RA.Y = LP.Bottom + 5;  // 5% below the legend
    RA.Width = LP.Width;
    RA.Height = 100 - LP.Bottom  - 10;  // leave 10% of the remaining space
}

Нам нужно адаптировать положение в некоторых точках, как здесь:

private void chart_SizeChanged(object sender, EventArgs e)
{
    RaPos();
}

И синхронизировать его сtextbox:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    RA.Text = textBox1.Text;
}

При сохранении всех аннотаций do сохраняются, если только они не были размещены за пределами видимой области ..:

chart.SaveImage(someFileName.png, ChartImageFormat.Png);

Эта аннотация всегда будет сохранятьзакреплен под легендой и изменит его высоту, чтобы красиво заполнить оставшееся пространство ..

Также обратите внимание, что, добавив это: RA.AllowTextEditing = true; пользователь может дважды щелкнуть прямоугольник и поместить Annotation в режим редактирования с необходимостью отдельного TextBox ..

enter image description here

Обновление 2:

Теперь, когда вы разместили график, я вижу, что вы прикрепляете Легенду внизу.Конечно, в коде потребуются некоторые изменения, например, такие:

При настройке я создаю пространство справа:

ChartArea ca = chart.ChartAreas[0];
ca.Position = new ElementPosition(5, 5, 75, 85); 

И в позиционировании создаю новую ElementPositionпрямо так, чтобы соответствовать:

// numbers are in percent!!
RA.X = 83;
RA.Y = 8;
RA.Width = 15;
RA.Height = 80;

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...