Сохранение диаграмм с более высоким разрешением без искажения внешнего вида - PullRequest
8 голосов
/ 10 марта 2012

вы все должны простить мое невежество, так как я только недавно начал работать с C #.У меня просто вопрос об управлении диаграммой окон, так как я сталкиваюсь с довольно тупой проблемой.

У меня есть программа, в которой есть несколько отчетов, которые включают в себя красивые окна Графики для представления некоторых данных.Тем не менее, я сохранял эти диаграммы в файлах и для различного использования, просто используя что-то вроде этого:

chart2.SaveImage (savefilename, ChartImageFormat.Png);

Моя первая проблема заключаетсяв том факте, что я не уверен, как сохранить это как более высокое разрешение без предварительного увеличения размера элемента управления диаграммой перед сохранением.Было бы неплохо иметь изображение приемлемого качества.

Вторая проблема заключается в том, что когда я увеличиваю размер элемента управления диаграммой, доступные операции, по-видимому, способны только увеличить размер фактической диаграммы,не метки или текст.Это не было бы проблемой, если бы я мог изменить все это вручную, что я и сделал для гистограммы, но есть одна линия, которую я не могу понять, как сделать толще: линии меток на круговой диаграмме,Я нарисовал стрелку к нему на следующем изображении:

http://www.bolinger.ca/chart.png

Таким образом, когда график увеличивается до разумного разрешения, эта линия становится почти невидимой из-за не увеличения соответствующего родственникаразмер.Я чувствую, что должен быть способ изменить это, но не могу понять, что это будет.

Снова, извините за мое невежество.Если бы хотя бы одну из этих двух проблем можно было решить, я мог бы быть спокойным, зная, что эти круговые диаграммы выглядят прилично.Спасибо!

Ответы [ 3 ]

10 голосов
/ 30 октября 2012

Создать / Дублировать скрытый (Visible = false) объект диаграммы на форме.Вы даже можете установить его свойства Top и Left вне формы.Установите для этого элемента управления очень большую ширину и высоту (т. Е. 2100 x 1500) ... Заполните и отформатируйте его в соответствии со своими требованиями.Обязательно увеличьте размеры шрифта и т. Д. Затем вызовите SaveImage () или DrawToBitmap () из скрытого графика ...

Когда вы сохраните этот файл, он по существу будет достаточно высокого разрешения для большинства текстовых редакторовнастольные пабы, печать и т. д. Например, 2100 x 1500 @ 300 точек на дюйм = 7 "x 5" для печати ...

В вашем приложении вы также можете уменьшить или распечатать его: уменьшить "добавляет «разрешение», поэтому изображение становится четче.Увеличение масштаба делает изображение размытым или размытым.

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

Например:

private void cmdHidden_Click(object sender, EventArgs e) {
    System.Windows.Forms.DataVisualization.Charting.Title chtTitle =
        new System.Windows.Forms.DataVisualization.Charting.Title();
    System.Drawing.Font chtFont = new System.Drawing.Font("Arial", 42);
    string[] seriesArray = { "A", "B", "C" };
    int[] pointsArray = { 1, 7, 4 };

    chart1.Visible = false;
    chart1.Width = 2100;
    chart1.Height = 1500;
    chart1.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.Bright;

    chtTitle.Font = chtFont;
    chtTitle.Text = "Demographics Comparison";
    chart1.Titles.Add(chtTitle);

    chart1.Series.Clear();

    // populate chart    
    for (int i = 0; i < seriesArray.Length; i++) {
        Series series = chart1.Series.Add(seriesArray[i]);
        series.Label = seriesArray[i].ToString();
        series.Font = new System.Drawing.Font("Arial", 24);
        series.ShadowOffset = 5;
        series.Points.Add(pointsArray[i]);
    }

    // save from the chart object itself
    chart1.SaveImage(@"C:\Temp\HiddenChart.png", ChartImageFormat.Png);

    // save to a bitmap
    Bitmap bmp = new Bitmap(2100, 1500);
    chart1.DrawToBitmap(bmp, new Rectangle(0, 0, 2100, 1500));
    bmp.Save(@"C:\Temp\HiddenChart2.png");
}
1 голос
/ 14 августа 2014

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Drawing.Chart;
using System.Drawing.Imaging;
using System.Windows.Forms.DataVisualization.Charting;
using System.Windows.Forms;

namespace Simple_Grapher
{
    class saveQualityChartImage
    {
        Chart theChart;
        System.Drawing.Font oldFont1 = new System.Drawing.Font("Trebuchet MS", 35F, System.Drawing.FontStyle.Bold);
        System.Drawing.Font oldFont2 = new System.Drawing.Font("Trebuchet MS", 15F, System.Drawing.FontStyle.Bold);
        System.Drawing.Font oldFont3 = new System.Drawing.Font("Trebuchet MS", 35F, System.Drawing.FontStyle.Bold);
        System.Drawing.Font oldLegendFont = new System.Drawing.Font("Trebuchet MS", 35F, System.Drawing.FontStyle.Bold);

        int oldLineWidth1;
        int oldLineWidth2;
        int oldLineWidth3;
        int oldLineWidth4;

        int oldWidth;
        int oldHeight;
        public saveQualityChartImage(Chart inputChart)
        {
            if (!(inputChart.Series.Count > 0))
            {
                return;
            }
            theChart = inputChart;
            if (inputChart.Titles.Count > 0)
            {
                oldFont1 = inputChart.Titles[0].Font;
            }
            oldFont2 = inputChart.ChartAreas[0].AxisX.LabelStyle.Font;
            oldFont3 = inputChart.ChartAreas[0].AxisX.TitleFont;
            if (theChart.Legends.Count > 0)
            {
                oldLegendFont = theChart.Legends["Legend"].Font;
            }
            oldLineWidth1 = theChart.ChartAreas[0].AxisX.LineWidth;
            oldLineWidth2 = theChart.ChartAreas[0].AxisX.MajorTickMark.LineWidth;
            oldLineWidth3 = theChart.Series[0].BorderWidth;
            oldLineWidth4 = theChart.ChartAreas[0].AxisY.MajorGrid.LineWidth;
            oldWidth = theChart.Width;
            oldHeight = theChart.Height;

            saveimage();
        }

        public void saveimage()
        {
            theChart.Visible = false;
            System.Drawing.Font chtFont = new System.Drawing.Font("Trebuchet MS", 35F, System.Drawing.FontStyle.Bold);
            System.Drawing.Font smallFont = new System.Drawing.Font("Trebuchet MS", 15F, System.Drawing.FontStyle.Bold);
            if (theChart.Titles.Count > 0)
            {
                theChart.Titles[0].Font = chtFont;
            }

            theChart.ChartAreas[0].AxisX.TitleFont = chtFont;
            theChart.ChartAreas[0].AxisX.LineWidth = 3;
            theChart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 3;
            theChart.ChartAreas[0].AxisX.LabelStyle.Font = smallFont;
            theChart.ChartAreas[0].AxisX.MajorTickMark.LineWidth = 3;

            theChart.ChartAreas[0].AxisY.TitleFont = chtFont;
            theChart.ChartAreas[0].AxisY.LineWidth = 3;
            theChart.ChartAreas[0].AxisY.MajorGrid.LineWidth = 3;
            theChart.ChartAreas[0].AxisY.LabelStyle.Font = smallFont;
            theChart.ChartAreas[0].AxisY.MajorTickMark.LineWidth = 3;
            if (theChart.Legends.Count > 0)
            {
                theChart.Legends["Legend"].Font = smallFont;
            }


            foreach (Series series in theChart.Series)
            {
                series.BorderWidth = 3;

            }

            theChart.Width = 1800;
            theChart.Height = 1200;

            SaveFileDialog save = new SaveFileDialog();
            save.DefaultExt = ".png";
            if (save.ShowDialog() == DialogResult.OK)
            {
                theChart.SaveImage(save.FileName, ChartImageFormat.Png);
            }
            resetOldValues();

        }

        private void resetOldValues()
        {
            if (theChart.Titles.Count > 0)
            {
                theChart.Titles[0].Font = oldFont1;
            }

            theChart.ChartAreas[0].AxisX.TitleFont = oldFont3;
            theChart.ChartAreas[0].AxisX.LineWidth = oldLineWidth1;
            theChart.ChartAreas[0].AxisX.MajorGrid.LineWidth = oldLineWidth4;
            theChart.ChartAreas[0].AxisX.LabelStyle.Font = oldFont2;
            theChart.ChartAreas[0].AxisX.MajorTickMark.LineWidth = oldLineWidth2;

            theChart.ChartAreas[0].AxisY.TitleFont = oldFont3;
            theChart.ChartAreas[0].AxisY.LineWidth = oldLineWidth1;
            theChart.ChartAreas[0].AxisY.MajorGrid.LineWidth = oldLineWidth4;
            theChart.ChartAreas[0].AxisY.LabelStyle.Font = oldFont2;
            theChart.ChartAreas[0].AxisY.MajorTickMark.LineWidth = oldLineWidth2;
            if (theChart.Legends.Count > 0)
            {
                theChart.Legends["Legend"].Font = oldLegendFont;
            }



            foreach (Series series in theChart.Series)
            {
                series.BorderWidth = oldLineWidth3;

            }

            theChart.Width = oldWidth;
            theChart.Height = oldHeight;
            theChart.Visible = true;   
        }  
    }
}
1 голос
/ 13 марта 2012

Попробуйте установить chart2.RenderTransform = new ScaleTransform(10,10) и сохраните его.Это также должно увеличить ваши линии.

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