我有我自己的代表图像数据的类。它们具有各种基础结构,但都具有索引属性,它返回第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事件处理程序中创建位图的整个想法看起来非常蹩脚。
有什么方法可以让我继续工作吗?
是的,我的意思是使用BitmapData的方法。您可以使用System.Runtime.InteropServices.Marshal.Copy方法将托管数组复制到BitmapData。 –
是的,创建和分配一次位图就足够了,但我想要的是避免创建位图。复制我的数据到位图,然后使用它来绘制看起来像一个冗余的解决方案。 –