无法获取 PictureBox 图像以编程方式更新

Cannot get PictureBox image to programmatically update

我有一个 C# winform 程序,它循环遍历图像,进行一些处理等。在处理时,我希望用户看到程序在什么图像上。我在我的程序中添加了一个图片框,我正在使用这个代码片段:

pbIDImage.ImageLocation = filepath;

如果我将这一行确切的代码放在表单构造函数中(带有要测试的硬编码文件路径),它会显示图像。但是如果我把它放在我真正需要它的图像处理循环中,图片框就永远不会显示图像。为什么它可以在构造函数中工作,但不能在程序的不同方法中工作?

知道为什么吗?

构造函数中的location变量只有在图像框第一次加载整个控件时才会被访问。

这意味着您可以在创建图像框后生成变量后更改代码,但这显然不会强制它加载图像。

您可以下载图像并保存到变量中。然后可以图像控件。

可能主要问题出在循环上。

如果路径正确,图像将加载,但没有足够的时间进行渲染,或者 UI 线程太忙而无法反映更改。

作为证据,您可能会看到最后一张图片已加载到图片框中。

作为解决方法,您可以在循环中使用此代码(我不推荐这样做,它只是为了测试)

pbIDImage.ImageLocation = filepath;
pbIDImage.Refresh();
Application.DoEvents();

但总的来说,我认为当你想在循环中更改它们时不需要显示图像,或者如果更改不是太快,你可以使用 backgroudworker 或基于任务的解决方案来设置图像.

您可以使用 PictureBox.Load Method。如文档中所述,要么设置 ImageLocation 然后调用 pictureBoX.Load(),要么直接使用接受图像位置的重载,如 pictureBox.Load(image_location);

请注意,此行为由 PictureBox.WaitOnLoad Property 控制,默认情况下为 false。所以另一种选择是将 属性 设置为 true,然后只使用 pictureBiox.ImageLocation = ...。如您所见,您有很多选择。

循环实际上导致 UI 冻结。我实现了一个后台工作程序,然后按预期加载图像——使用 picturebox.ImageLocation()。这就是为什么它在构造函数中加载正常(循环尚未开始,UI 是免费的)然后当循环开始时,图像在处理过程中无法加载。