2011-10-17 21 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

是的,创建和分配一次位图就足够了,但我想要的是避免创建位图。复制我的数据到位图,然后使用它来绘制看起来像一个冗余的解决方案。 –

相关问题