2011-10-17 12 views
0

画像データを表す独自のクラスがあります。それらはさまざまな基底構造を持ちますが、すべてi、j番目のイメージ要素を返すインデックス付きプロパティを持っています。私はこのようなイメージをフォームに表示する必要があります。今、私はそれらをSystem.Drawing.Bitmapに事前変換して、それを標準のWinforms PictureBoxに表示します。私の考えは、自分の画像タイプのプロパティを持つカスタムコントロールを作成し、暫定的にそれをSystem.Drawing.BitmapまたはSystem.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は非常にゆっくりと働くことができることを理解しています。

もう1つのアイデアは、マーシャリングを使用してビットマップのピクセルを割り当てることですが、OnPaintイベントハンドラ内にビットマップを作成するという考えは全く変わっています。

どのような方向で私の仕事を続けるべきですか?

答えて

1

カスタムコントロールを作成して、OnPaintメソッドをオーバーライドすると、表示するデータが何らかの方法でベクトルになっていれば価値があります。表示するイメージがある場合は、Bitmapオブジェクトを作成するよりも良い方法はありません。

私はSetPixelが遅いことを知っています。「ビットマップのピクセルを割り当てるためにマーシャリングを使用する」とは何を意味するのかよく分かりませんが、System.Drawing.Imaging.BitmapDataクラスとBitmap.LockBitsメソッドを使用する高速代替方法があります。使用例hereを参照してください。

ところで、なぜBitmapオブジェクトをOnPaintメソッドで作成する必要がありますか?一度作成して十分に割り当てていないのですか?

+0

はい、私はBitmapDataを使ったメソッドを正確に意味していました。 System.Runtime.InteropServices.Marshal.Copyメソッドを使用すると、管理対象配列をBitmapDataにコピーできます。 –

+0

はい、ビットマップの作成と割り当ては1回で十分ですが、私が望むのは、ビットマップを作成しないことです。私のデータをビットマップにコピーして描画するのは、冗長なソリューションのようです。 –

関連する問題