2011-03-20 20 views
0

我有一个窗体,其中包含一个微调和一个空白区域,我将绘制图像与滑块上设置的比例。图像路径是在表单加载并且不会更改时创建的。目前我使用像这样显示图像:更快的图像加载在C + +形式

void drawImages(void) 
    { 
     //... 

     clearImages(); 
     for each(String ^image in images) 
     { 
      box = gcnew PictureBox; 
      box->Name = "pictureBox" + i.ToString(); //Used when deleting. 
      // setting properties snipped 
      box->Image = Image::FromFile(image); 
      Controls->Add(box); 
     } 
    } 

而这里的清除码,有线到“值改为”微调的事件和形式的“调整”事件:

void clearImages(void) 
    { 
     for(int i=0; i<images->Count; ++i) 
      Controls->RemoveByKey("pictureBox" + i.ToString()); 
    } 

问题是,他们的照片花了很长时间重新加载和闪烁,因为这一点。有没有办法补救?我想知道的一个改进就是在用户从旋转器中提起鼠标时重新绘制图像,而不是每次改变时都重绘它。

+0

因为您删除并添加了控件,所以它会闪烁。这需要很长时间,因为您重新加载图像。当您调整表单的大小时,这当然不是您想要做的事情。调整图片框的大小,必要时不要重新创建它们。不知道微调者做了什么。 – 2011-03-20 21:24:05

+0

用于设置图像的比例。当您增加比例时,图像会变大,并以不同的布局重新绘制。 – 2011-03-20 21:44:42

+0

是的,调整控件的大小,不要重新创建它。容易做与锚属性。我之前提到过使用OnPaint吗? – 2011-03-20 21:55:10

回答

0

因此,我编写了一个应用程序,它必须根据滑块的值调整图像中的各种参数,并且您可以尝试几件事情。

首先,缓存你的图片。您每次都从磁盘加载它们,这比从内存中检索它们要慢很多。只有在必要时才从磁盘加载。

其次,不要添加和删除控件,而是可以使用现有控件来显示图像并更改图像/根据需要调整控件的大小。

三,双缓冲你的显示逻辑。在这种情况下,它可能无法帮助你,因为无论如何你都会将它们投射到屏幕上,但它值得一试。

第四,您可以使用计时器而不是微调器的值更改事件。当用户拖动滑块启动计时器,并在计时器滴答事件中执行您的逻辑。当用户放开滑块时停止定时器。这样你可以控制最大更新速度。

最后,我不得不直接对图像数据进行图像处理,因为GDI +有点太慢了。不过,你实际上并没有改变像素数据,所以一个块传输(blt)应该足够快。

我希望有一些帮助。

+0

只要保持控件的效果,即使图像比应用程序要处理的大得多。 – 2011-03-20 21:43:39

+0

是的,在这种情况下,创建,添加和删除这些控件的代价很高。此外,他们使用上面的一些技术(即1和可能的3和5),所以你可以免费获得。 – 2011-03-20 22:17:14