以C ++形式加载更快的图像

时间:2011-03-20 21:09:13

标签: winforms image c++-cli

我有一个包含微调器和空白区域的表单,我将使用滑块上的比例设置图像。表单加载时不会更改图像路径。目前我正在使用这样的东西来显示图像:

    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);
         }
    }

这里是清算代码,连接到微调器的'value changed'事件和表单的'resized'事件:

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

问题在于它们的图片需要很长时间才能重新加载和闪烁,因为这样。有没有办法解决这个问题?我知道我想做的一个改进是当用户从微调器上抬起鼠标时重绘图像,而不是每次改变时重绘它。

1 个答案:

答案 0 :(得分:0)

所以,我写了一个应用程序,必须根据滑块的值调整图像中的各种参数,你可以尝试一些事情。

首先,缓存图像。您每次都从磁盘加载它们比从内存中检索它们慢得多。只在必要时从磁盘加载。

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

第三,双重缓冲你的显示逻辑。在这种情况下,它可能对你没什么帮助,因为无论如何你都是一次性将它们连接到屏幕上,但值得一试。

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

最后我必须直接对图像数据进行操作才能执行我的图像操作,因为GDI +只是有点太慢了。但是,你实际上并没有改变像素数据,因此位块传输(blt)应该足够快。

我希望其中一些有帮助。