【问题标题】:Images from url to listview图片从 url 到 listview
【发布时间】:2012-10-02 15:00:39
【问题描述】:

我有一个列表视图,可以显示来自 YouTube 的视频结果。一切正常,但我注意到的一件事是它的工作方式似乎有点慢,这可能是由于我的代码。有什么建议可以让我做得更好吗?也许直接从 url 加载图像而不是使用 web 客户端?

我正在从使用 YouTube API 的查询返回的视频提要中循环添加列表视图项。我认为减慢速度的代码是这样的:

Feed<Video> videoFeed = request.Get<Video>(query);
int i = 0;
foreach (Video entry in videoFeed.Entries)
{
string[] info = printVideoEntry(entry).Split(',');
WebClient wc = new WebClient();
wc.DownloadFile(@"http://img.youtube.com/vi/" + info[0].ToString() + "/hqdefault.jpg", info[0].ToString() + ".jpg");

string[] row1 = { "", info[0].ToString(), info[1].ToString() };
ListViewItem item = new ListViewItem(row1, i);
YoutubeList.Items.Add(item);

imageListSmall.Images.Add(Bitmap.FromFile(info[0].ToString() + @".jpg"));
imageListLarge.Images.Add(Bitmap.FromFile(info[0].ToString() + @".jpg"));
}
public static string printVideoEntry(Video video)
{
  return video.VideoId + "," + video.Title;
}

如您所见,我使用了一个 Web 客户端来下载图像,这样我就可以将它们用作列表视图中的图像。它有效,但我担心的是速度..有什么建议吗?也许是不同的控件?

【问题讨论】:

  • 您应该在单独的线程中下载图像。该线程应填充 imageLists,但在访问 UI 线程时要小心。
  • @Nick 你有这方面的例子吗?这是我第一次使用 winforms 我更像是一个 asp.net 类型的人大声笑..谢谢
  • 你能把代码贴在你填写信息数组的地方吗?
  • @Nick 刚刚添加了它..希望它有所帮助

标签: c# winforms image listview webclient


【解决方案1】:

好的,我希望这是您正在寻找的代码,我无法测试它,因为我没有您正在使用的 dll,但我认为没问题。

            Feed<Video> videoFeed = request.Get<Video>(query);

            Thread th = new Thread(new ParameterizedThreadStart( GetImages));
            th.Start(videoFeed);
            int i = 0;
            foreach (Video entry in videoFeed.Entries)
            {
                string[] info = printVideoEntry(entry).Split(',');
                string[] row1 = { "", info[0].ToString(), info[1].ToString() };
                ListViewItem item = new ListViewItem(row1, i++);
                YoutubeList.Items.Add(item);
            }

        }
        void GetImages(object arg)
        {
            Feed<Video> videoFeed = Feed<Video> arg;
            foreach (Video entry in videoFeed.Entries)
            {
                string[] info = printVideoEntry(entry).Split(',');
                WebClient wc = new WebClient();
                wc.DownloadFile(@"http://img.youtube.com/vi/" + info[0].ToString() + "/hqdefault.jpg", info[0].ToString() + ".jpg");
                ImageAdd(info[0]+".jpg");
            }
        }
        delegate void imageAdder(string imgName);
        void AddImage(string imgName)
        {
            imageListSmall.Images.Add(Bitmap.FromFile(imgName + @".jpg"));
            imageListLarge.Images.Add(Bitmap.FromFile(imgName + @".jpg"));
            listView1.Refresh();
        }
        void ImageAdd(string imgName)
        {
            this.Invoke(new imageAdder(AddImage), new object[] { imgName });
        }

试试吧,如果你有问题我会评论它。

【讨论】:

  • 现在我认为它仍在下载它在该循环中找到的每个图像,对吗?我是因为我仍然看到 wc.DownloadFile 被调用..我想知道我是否可以通过使用“img.youtube.com/vi”url 而不是 FromFile() 来避免这一切
  • 你可以直接从流中制作位图,但你应该制作 httprequests。该代码是某种延迟加载。显然,listview 的填充速度比图像的下载速度要快。我希望我对你有足够的帮助,所以你可以自己继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多