2016-02-09 41 views
-3

我正在創建一個gannt圖表,以顯示數百個日曆中的單個訂單實例,目前使用算法繪製線條和矩形創建網格,問題是我是位圖變得越來越大,佔用內存,我嘗試了多種不同的方法,包括繪製一半大小的位圖並擴展它們(出來非常模糊)並且仍然很大。C#中的SVG,繪製多個複雜的矩形

我希望能夠繪製SVG,因爲我認爲繪製大型簡單形狀的東西應該與位圖相比顯着減小大小。

問題是我無法找到msdn上的任何東西,包括任何類型的繪圖svgs的c#庫,我不想使用外部代碼。

我需要在XAML中創建它還是存在類似於位圖繪製的庫? current bitmap version, either going out of bounds on the max size or just freezing because system is out of memory

回答

0

Windows窗體= GDI/GDI +

WPF/XAML = DirectX的(如果可能)

最好的選擇是去與支撐可伸縮矢量圖形(未一樣WPF/XAML。 svg文件格式)

您需要第三方代碼才能在WinForms中執行SVG。


如果你堅持使用WinForms,那麼位圖是真正實現這一目標的唯一方法。看看PixelFormat - 例如,您可以通過使用每像素比特數較少的格式來減少內存中位圖的大小。

+0

我試圖用位圖縮小尺寸,但要改變像素格式,你不能使用繪圖,因爲索引像素格式不允許從我可以看到哪些本來是較小的,我嘗試繪製圖像在一個較小的然後縮放比較低質量的圖像,但是由於某種原因,我無法理解位圖放大時的模糊效果。 – oisins

0

沒有必要使用外部工具或SVG。通過一些簡單的數學運算,您可以輕鬆地呈現想要顯示的必要部分。您只需要知道網格大小,日期範圍和視圖中可見的訂單項的範圍。讓我們稱他們爲:

DateTime dispStartDate; 
DateTime dispEndDate; 
int dispStartItem; 
int dispEndItem; 
int GridSize = 10; //nifty if you'd like a magnification factor 

我們還假設你有一個甘特圖項目類:

class gItem 
{ 
    DateTime StartDate{ get; set; } 
    DateTime EndDate{ get; set; } 
    int LineNumber{ get; set; } 
    int Length { get { return EndDate - StartDate; } } 
    //some other code and stuff you'd like to add 
} 

現在,您需要包含所有的甘特圖條目列表:

List<gItem> GanttItems; 

現在你應該爲每個上述變量賦值,現在是時候生成一個矩形列表,該矩形列表在視圖中可見並繪製它們:

List<Rectangle> EntryRects = new List<Rectangle>(); 

void UpdateDisplayBounds() 
{  
    foreach(gItem gEntry in GanttItems) 
    { 
     if(gEntry.StartDate < dispEndDate && gEntry.EndDate > dispStartDate 
      && gEntry.LineNumber >= dispStartItem && gEntry.LineNumber <= dispEndItem) 
     { 
      int x = (gEntry.StartDate - dispStartDate) * GridSize; 
      int y = (gEntry.LineNumber - dispStartItem) * GridSize; 
      int width = gEntry.Length * GridSize; 
      int height = GridSize; 
      EntryRects.Add(new Rectangle(x, y, width, height); 
     } 
    }  
} 

現在,您只有可以呈現的顯示邊界內的矩形列表。所以我們來畫一下:

void DrawRectangles(Graphics canvas)//use a picturebox's graphics handler or something for the canvas 
{ 
    canvas.Clear(this.BackColor); 
    using(SolidBrush b = new SolidBrush(Color.Blue)) //Choose your color 
    { 
     foreach(Rectangle r in EntryRects) 
     { 
      canvas.FillRectangle(b, r); 
     } 
    } 
} 

上面的代碼應該讓你開始。有了這個,你可以根據請求渲染一個矩形列表,並且內存中唯一的圖像佔用空間是當前顯示的空間。

+0

你的Gannt列表字面上是我目前所擁有的,我使用數學來繪製我的位圖,目前以非常相似的方式,我會嘗試這種方法。謝謝 – oisins