我有自己的代表图像数据的类。它们具有各种底层结构,但都具有索引属性,该属性返回第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的工作速度非常慢。
另一个想法是使用编组来分配位图的像素,但在OnPaint事件处理程序中创建位图的整个想法似乎很蹩脚。
对于我应该继续工作的方向,是否有任何建议?
答案 0 :(得分:1)
如果要显示的数据在某种程度上是矢量的,那么创建自定义控件并覆盖OnPaint方法将是有价值的。如果要显示图像,则似乎没有比创建Bitmap对象更好的选择。
我知道SetPixel很慢,我不确定你使用'编组来分配位图的像素'是什么意思,但是有一个使用System.Drawing.Imaging.BitmapData
类和Bitmap.LockBits
方法的快速替代方法。请参阅示例用法here。
顺便说一句,为什么需要在OnPaint方法中创建Bitmap对象?是不是一次创建和分配它?