【问题标题】:Load image into picturebox only when needed/visible仅在需要/可见时将图像加载到图片框中
【发布时间】:2012-02-04 17:34:18
【问题描述】:

我正在编写一个显示图像缩略图的小应用程序。所有显示的图像都在同一个目录中,每个图像都在它自己的组框中,带有一些标签和一个复选框。所有的分组框都被添加到一个 flowlayoutpanel 中。问题是,图像的数量可能会变得非常大,我担心如果我加载所有图像,即使它们还不可见,内存使用/性能可能会有点失控。

有没有办法只加载用户当前可见的图像?我的第一个想法是存储我的框的位置并根据滚动位置确定要加载哪些图像,或者是否有更简单的方法来确定图片框/组框当前是否可见?

【问题讨论】:

    标签: c# image scroll picturebox groupbox


    【解决方案1】:

    理想情况下,您应该做的是创建缓冲区逻辑,而不是隐藏一张图像并显示另一张图像。在显示图像之前有几个缓冲区加载图像并有固定数量的实际字段显示图像而不是每个图像的新集合是一个更好的主意。

    但如果您的解决方案需要,请尝试创建自定义用户控件。

    试试这样的:

    public class customUserControl : UserControl
    {
        //Store image as a Uri rather than an Image
        private Uri StoredImagePath;
        public class PictureBoxAdv : PictureBox
        {
            public PictureBoxAdv()
            {
                this.VisibleChanged +=new EventHandler(VisibleChanged);
            }
        }
        public Uri Image
        {
            get { return StoredImagePath; }
            set
            {
                StoredImagePath = value;
                if (this.Visible && StoredImagePath != null)
                {
                    this.Image = Image.FromFile(StoredImagePath.AbsolutePath);
                }
            }
        }
        public void VisibleChanged(object sender, EventArgs e)
        {
            //When becomes visible, restore image, invisible, nullify.
            if (this.Visible && StoredImagePath != null)
            {
                this.Image = Image.FromFile(StoredImagePath.AbsolutePath);
            }
            else
            {
                this.Image = null;
            }
        }
    }
    

    【讨论】:

    • 那么您的意思是:有一定数量的可见框并更改这些框中显示的图像?我目前有一个包含所有图像文件名的列表。我基本上可以使用滚动条并将最小/最大值设置为我拥有的任何数量的图像,然后换出当前显示的图像。我不明白的是缓冲区逻辑,你能详细说明一下吗?
    • 缓冲逻辑很简单,只需将所有图像存储在 List 对象中,当您要调用特定图像替换另一个图像时,只需调用 imageBox1.Image = Image.FromFile( uiList[2].AbsolutePath);如果需要,您可以使用其他图像与当前图像交换,这样您就可以在后台加载图像,一旦加载它们,就可以将它们放到您要替换的 PictureBox 中。
    • 啊哈,这基本上就是我所做的。我最终在表单上放置了 6 个分组框和一个滚动条。我将所有图像路径存储在一个列表中,滚动条值确定显示哪些图像。图像显示部分在单独的线程中处理。感谢您的帮助!
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多