用于显示图像的自定义控件

时间:2011-10-17 13:53:11

标签: .net winforms image drawing gdi+

我有自己的代表图像数据的类。它们具有各种底层结构,但都具有索引属性,该属性返回第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 个答案:

答案 0 :(得分:1)

如果要显示的数据在某种程度上是矢量的,那么创建自定义控件并覆盖OnPaint方法将是有价值的。如果要显示图像,则似乎没有比创建Bitmap对象更好的选择。

我知道SetPixel很慢,我不确定你使用'编组来分配位图的像素'是什么意思,但是有一个使用System.Drawing.Imaging.BitmapData类和Bitmap.LockBits方法的快速替代方法。请参阅示例用法here

顺便说一句,为什么需要在OnPaint方法中创建Bitmap对象?是不是一次创建和分配它?