2011-10-17 53 views
0

我有我自己的代表圖像數據的類。它們具有各種基礎結構,但都具有索引屬性,它返回第i,第j個圖像元素。我需要在表單中顯示這些圖像。現在我預先將它們轉換爲System.Drawing.Bitmap,然後將它顯示在標準的Winforms PictureBox中。我的想法是創建一個自定義控件,該控件將具有我的圖像類型的屬性,並將顯示一張圖片,但不會將其初始轉換爲System.Drawing.BitmapSystem.Drawing.Image用於顯示圖像的自定義控件

我建議這個問題的線索是在那裏創建一個用戶繪製的控件並重寫OnPaint事件。

protected override void OnPaint(PaintEventArgs e) 
    { 
     for(int i=e.ClipRectangle.Left; i<=e.ClipRectangle.Right; i++) 
     { 
      for (int j = e.ClipRectangle.Top; j <= e.ClipRectangle.Bottom; j++) 
      { 
       //do something with i and j here 
       //calculate the corresponding k and l indices 
       //assign _myCustomClassImage[k,l] somewhere 
      } 
     } 

    } 

是的,我知道我可以創建剪裁矩形的大小的位圖,並使用SetPixel指定它的元素,但SetPixel運行很慢。

另一個想法是使用編組來分配位圖的像素,但在OnPaint事件處理程序中創建位圖的整個想法看起來非常蹩腳。

有什麼方法可以讓我繼續工作嗎?

回答

1

如果您要顯示的數據是以某種方式呈現向量,則創建自定義控件並重寫OnPaint方法將具有價值。如果您有要顯示的圖像,似乎沒有比創建Bitmap對象更好的替代方法。

我知道SetPixel速度很慢,我不確定你用'使用編組來分配位圖像素'的意思,但有一個使用System.Drawing.Imaging.BitmapData類和Bitmap.LockBits方法的快速替代方法。查看示例用法here

順便說一下,爲什麼你需要在OnPaint方法中創建Bitmap對象?是不是創建和分配一次就足夠了?

+0

是的,我的意思是使用BitmapData的方法。您可以使用System.Runtime.InteropServices.Marshal.Copy方法將託管數組複製到BitmapData。 –

+0

是的,創建和分配一次位圖就足夠了,但我想要的是避免創建位圖。複製我的數據到位圖,然後使用它來繪製看起來像一個冗餘的解決方案。 –

相關問題