我正在創建一個gannt圖表,以顯示數百個日曆中的單個訂單實例,目前使用算法繪製線條和矩形創建網格,問題是我是位圖變得越來越大,佔用內存,我嘗試了多種不同的方法,包括繪製一半大小的位圖並擴展它們(出來非常模糊)並且仍然很大。C#中的SVG,繪製多個複雜的矩形
我希望能夠繪製SVG,因爲我認爲繪製大型簡單形狀的東西應該與位圖相比顯着減小大小。
問題是我無法找到msdn上的任何東西,包括任何類型的繪圖svgs的c#庫,我不想使用外部代碼。
我正在創建一個gannt圖表,以顯示數百個日曆中的單個訂單實例,目前使用算法繪製線條和矩形創建網格,問題是我是位圖變得越來越大,佔用內存,我嘗試了多種不同的方法,包括繪製一半大小的位圖並擴展它們(出來非常模糊)並且仍然很大。C#中的SVG,繪製多個複雜的矩形
我希望能夠繪製SVG,因爲我認爲繪製大型簡單形狀的東西應該與位圖相比顯着減小大小。
問題是我無法找到msdn上的任何東西,包括任何類型的繪圖svgs的c#庫,我不想使用外部代碼。
Windows窗體= GDI/GDI +
WPF/XAML = DirectX的(如果可能)
最好的選擇是去與支撐可伸縮矢量圖形(未一樣WPF/XAML。 svg文件格式)
您需要第三方代碼才能在WinForms中執行SVG。
如果你堅持使用WinForms,那麼位圖是真正實現這一目標的唯一方法。看看PixelFormat - 例如,您可以通過使用每像素比特數較少的格式來減少內存中位圖的大小。
沒有必要使用外部工具或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);
}
}
}
上面的代碼應該讓你開始。有了這個,你可以根據請求渲染一個矩形列表,並且內存中唯一的圖像佔用空間是當前顯示的空間。
你的Gannt列表字面上是我目前所擁有的,我使用數學來繪製我的位圖,目前以非常相似的方式,我會嘗試這種方法。謝謝 – oisins
我試圖用位圖縮小尺寸,但要改變像素格式,你不能使用繪圖,因爲索引像素格式不允許從我可以看到哪些本來是較小的,我嘗試繪製圖像在一個較小的然後縮放比較低質量的圖像,但是由於某種原因,我無法理解位圖放大時的模糊效果。 – oisins