画像データを表す独自のクラスがあります。それらはさまざまな基底構造を持ちますが、すべて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イベントハンドラ内にビットマップを作成するという考えは全く変わっています。
どのような方向で私の仕事を続けるべきですか?
はい、私はBitmapDataを使ったメソッドを正確に意味していました。 System.Runtime.InteropServices.Marshal.Copyメソッドを使用すると、管理対象配列をBitmapDataにコピーできます。 –
はい、ビットマップの作成と割り当ては1回で十分ですが、私が望むのは、ビットマップを作成しないことです。私のデータをビットマップにコピーして描画するのは、冗長なソリューションのようです。 –