从网上取图片并顺序显示
Posted
技术标签:
【中文标题】从网上取图片并顺序显示【英文标题】:Fetching pictures from the net and displaying it sequentially 【发布时间】:2008-11-25 18:19:20 【问题描述】:我想创建一个从 Internet 获取的图片的可滚动列表,并让用户能够点击它。我该如何在 WinForms/C# 中进行操作?是否可以将图片框控件/控件添加到列表框?
我尝试在 AutoScroll 设置为 true 的情况下将图片框列表添加到 UserControl 中,这会给我一种使用列表框的感觉,这是正确的方法吗?
我还尝试将图片框的 ImageLocation 设置为图像的 URI,然后调用 Load() 来加载图像,它确实有效,但是我的表单冻结了!如何在不冻结表单的情况下按顺序更新每个图片框?
谢谢你, 阿兹兰
【问题讨论】:
【参考方案1】:我会先回答你的第三个问题,因为这是我唯一真正知道答案的问题。图片框上有一个 LoadAsync() 方法,它将在单独的线程中加载图像并且不会挂起您的应用程序。
至于其他问题,我也很可能从用户控件开始并将图像放在那里。我唯一能建议的是首先创建一个用户控件,该控件有一个图片框,旁边可能还有一个多行文本框或richtextbox。关闭文本框上的边框,并在整个控件周围有一个轻微的边框。这将允许您显示图像,旁边有一些文本。然后,您的实际最终控件将只是这些控件的集合,并且可以根据需要添加它们。
--我的 2 美分...
【讨论】:
谢谢,让我试试 loadAsync() 方法,我正在做你提到的确切方法 嘿,这种方法是否需要将基本控件放置在类似 MDI 的应用程序中?它会阻止应用程序冻结吗?【参考方案2】:你介意垂直滚动吗?
我将从 DataGridView 控件作为基础开始并创建以下实现:
1) 创建从 DataGridViewImageColumn 派生的自定义列和单元格类型。你可以称它们为“CronosNetImageColumn”、“CronosNetImageCell”。
2) 创建一个类“CronosImageDetails”来保存单元格数据(包括显示文本和图像 url 的属性)。这将作为每个单元格的值传入。例如:
ImageGrid.Rows.Add(new CronosImageDetails DisplayText="Day at the Beach", ImageURL="http://...beach.jpg" );
3) 覆盖单元格 Paint() 以使用 WebClient 获取图像并使用 e.Graphics.DrawImage(ImageObtainedFromWebClient) 将图像绘制到单元格。您可以使用 e.Graphics.DrawString((CronosImageDetails)value.DisplayText,...) 覆盖单元格中的文本。
此快速解决方案将为您提供一个滚动图像列表,该列表仅在用户滚动列表时加载图像,并为改进提供坚实的基础。
推荐的进一步优化:
A) 创建用于绘制单元数据的后缓冲位图和图形。
B) 设置 Paint() 以简单地绘制后缓冲区,而不是执行获取图像的工作
C) 创建一个新的单元格方法 LoadImage(),它会生成一个新线程来下载图像并将其绘制到后台缓冲区。
D) 让 Paint()(或单独的辅助线程)跟踪滚动的方向和加速度,并估计哪些单元格需要预加载。在这些单元格上触发 LoadImage()。
E) 使用加载图像初始化每个单元格的后台缓冲区。
F) 跟踪并使用来自图像加载时间的经验数据来帮助确定需要预加载哪些单元格。
【讨论】:
以上是关于从网上取图片并顺序显示的主要内容,如果未能解决你的问题,请参考以下文章