2012-03-09 23 views
6

bạn sẽ phải bỏ qua sự thiếu hiểu biết của mình vì gần đây tôi mới bắt đầu làm việc với C#. Tôi chỉ có một câu hỏi về kiểm soát biểu đồ cửa sổ, khi tôi gặp phải một vấn đề khá câm.Lưu các biểu đồ có độ phân giải cao hơn mà không làm rối tung sự xuất hiện

Tôi có một chương trình có một vài báo cáo bao gồm cửa sổ tìm kiếm đẹp Biểu đồ đại diện cho một số dữ liệu. Tuy nhiên, tôi đã lưu các biểu đồ này vào các tệp cũng như cho các mục đích sử dụng khác nhau, chỉ bằng cách sử dụng một cái gì đó như thế này:

chart2.SaveImage (savefilename, ChartImageFormat.Png);

Vấn đề đầu tiên của tôi nằm trong thực tế là tôi không chắc chắn làm thế nào để lưu này như là một độ phân giải cao hơn mà không cần tăng kích thước của điều khiển biểu đồ trước khi lưu. Sẽ rất tuyệt khi có một hình ảnh có chất lượng hợp lý.

Vấn đề thứ hai là khi tôi tăng kích thước của điều khiển biểu đồ, các hoạt động có sẵn dường như chỉ có thể tăng kích thước biểu đồ thực tế, không phải nhãn hoặc văn bản. Đây không phải là vấn đề nếu tôi có thể thay đổi tất cả những thứ này theo cách thủ công, đó là những gì tôi đã làm cho một biểu đồ thanh, nhưng có một dòng tôi không thể tìm ra cách làm dày hơn: các dòng nhãn trên biểu đồ hình tròn . Tôi đã rút ra một mũi tên để nó trong hình dưới đây:

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

Vì vậy, khi biểu đồ được tăng lên đến một độ phân giải hợp lý dòng này là gần như vô hình do không tăng đến một kích thước tương đối thích hợp. Tôi cảm thấy như có một cách để thay đổi nó, nhưng không thể tìm ra nó sẽ là gì.

Một lần nữa, xin lỗi sự thiếu hiểu biết của tôi. Nếu một trong hai vấn đề này có thể được giải quyết thì tôi có thể yên tâm khi biết rằng các biểu đồ hình tròn này trông khá tốt. Cảm ơn!

Trả lời

1

Thử đặt chart2.RenderTransform = new ScaleTransform(10,10) và lưu. Điều này cũng nên làm cho dòng của bạn lớn hơn.

8

Tạo/Nhân bản đối tượng ẩn (Hiển thị = false) trên biểu mẫu. Bạn thậm chí có thể thiết lập các thuộc tính trên cùng và bên trái của nó để được tắt của biểu mẫu. Đặt điều khiển này thành Độ rộng và Chiều cao rất cao (tức là, 2100 x 1500) ... Điền và định dạng nó thành thông số kỹ thuật của bạn. Hãy chắc chắn để tăng kích thước phông chữ, vv Sau đó gọi SaveImage() hoặc DrawToBitmap() từ biểu đồ ẩn ...

Khi bạn lưu tệp này, về cơ bản nó sẽ có độ phân giải đủ cao cho hầu hết các xử lý văn bản, quán rượu trên máy tính để bàn , in ấn, vv Ví dụ: 2100 x 1500 @ 300 dpi = 7 "x 5" để in ...

Trong ứng dụng của bạn, bạn cũng có thể giảm kích thước hoặc in ra: giảm tỷ lệ "thêm" độ phân giải, để hình ảnh trở nên sắc nét hơn. Mở rộng quy mô làm cho hình ảnh mờ hoặc mờ.

Tôi đã phải dựa vào kỹ thuật này, vì đây là cách nhất quán nhất để có biểu đồ độ phân giải cao từ điều khiển biểu đồ .Net cho in ấn hoặc lưu ... Đây là một trò lừa đảo cổ điển, nhưng nó hoạt động :)

Ví dụ:

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

Dưới đây là một lớp học tôi đã thực hiện để làm cho một đồ thị lớn hơn, lưu nó, sau đó khôi phục đồ thị. Hoạt động tốt cho mục đích của tôi.

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; 
     } 
    } 
} 
Các vấn đề liên quan